Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 子查询中的变量未接收变量值_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 子查询中的变量未接收变量值

Sql 子查询中的变量未接收变量值,sql,sql-server,tsql,Sql,Sql Server,Tsql,我以前从未尝试过将变量值传递给子查询,而且我似乎做得不对。我没有收到任何错误,但也没有得到任何结果,而如果我将startdate、enddate和role的值硬编码到子查询中,它就会正确运行 ======================编辑======================= 糟糕的是,我发布了我正在玩的早期测试脚本,它确实充满了错误,对此表示抱歉。以下是我正在使用的实际代码的全部内容: DECLARE @Role varchar, @StartDate datetime,

我以前从未尝试过将变量值传递给子查询,而且我似乎做得不对。我没有收到任何错误,但也没有得到任何结果,而如果我将startdate、enddate和role的值硬编码到子查询中,它就会正确运行

======================编辑=======================

糟糕的是,我发布了我正在玩的早期测试脚本,它确实充满了错误,对此表示抱歉。以下是我正在使用的实际代码的全部内容:

DECLARE @Role varchar,
    @StartDate datetime,
    @Enddate datetime;

SET     @Role = 'Volunteer';
SET     @StartDate = DATEADD(d, -100, getdate());
SET     @Enddate = getdate();

SELECT rolename, Category, [1] as [1 Day],[2] as [2 Days],[3] as [3 Days],[4] as [4 Days],[5] as [5 Days],[6] as [6 Days],[7] as [7 Days]  FROM
(SELECT    CriminalHistoryID, vps.RoleName, 'Rec2PreClr' as Category,
        DATEDIFF(d, chc.ReceiveDate, chc.PreClrDate) as DaysDif
  FROM  dbo.v_PersonStatus vps
              INNER JOIN dbo.CriminalHistoryCheck chc
                    ON vps.PersonID = chc.PersonID
  WHERE chc.ReceiveDate BETWEEN @StartDate AND @Enddate AND vps.rolename = @Role and DATEDIFF(d, chc.ReceiveDate, chc.PreClrDate) BETWEEN 0 and 7
  UNION
  SELECT      CriminalHistoryID, vps.RoleName, 'PreClr2Clr' as Category,
              DATEDIFF(d, chc.PreClrDate, chc.FinalDate) as DaysDif
  FROM  dbo.v_PersonStatus vps
              INNER JOIN dbo.CriminalHistoryCheck chc
                    ON vps.PersonID = chc.PersonID
  WHERE chc.ReceiveDate BETWEEN @StartDate AND @Enddate AND vps.rolename = @Role AND DATEDIFF(d, chc.PreClrDate, chc.FinalDate) BETWEEN 0 and 7
  UNION
  SELECT      CriminalHistoryID, vps.RoleName, 'Rec2Clr' as Category,
              DATEDIFF(d, chc.ReceiveDate, FinalDate) as DaysDif
  FROM  dbo.v_PersonStatus vps
              INNER JOIN dbo.CriminalHistoryCheck chc
                    ON vps.PersonID = chc.PersonID
  WHERE chc.ReceiveDate BETWEEN @StartDate AND @Enddate AND vps.rolename = @Role AND DATEDIFF(d, chc.ReceiveDate, FinalDate) BETWEEN 0 and 7
  ) UNIONqry
PIVOT
(count(CriminalHistoryID) for DaysDif in ([1],[2],[3],[4],[5],[6],[7])) pvt
Order by RoleName, Category
@Startdate、@Enddate和@Role的值似乎没有进入子查询。我是否需要做些什么来告诉潜艇从盒子外面看?

两个问题:

  • 您没有为volStatus赋值
  • 它应该是
    @volstatus
    ,而不是
    @volstatus
    -没有空格
  • 因此,改变:

    WHERE chc.ReceiveDate BETWEEN @StartDate AND @Enddate AND vps.rolename = @ VolStatus and DATEDIFF(d, chc.ReceiveDate, chc.PreClrDate) BETWEEN 0 and 7
    
    致:


    你犯了什么错误?您确定要同时运行所有代码吗?您不能先运行
    declare
    ,然后再运行子查询——对于正在运行的语句,定义只能持续一段时间。看起来这不是全部代码,而是一个联合。如果您按照这里所写的方式运行所有这些,它将失败并出现语法错误。如果您不设置@VolStatus,它将为NULL。根据您的ANSI_NULL设置,您可以获取数据,也可以不获取数据。。。我猜这可能是您的问题。请注意,您确实不应该在日期/时间/时间戳类型中使用
    BETWEEN
    。真的,这是一种错误的思考时间的方式,不管。。。RDBMS可能有不规则之处。@Clockwork Muse-我应该怎么做?
    WHERE chc.ReceiveDate BETWEEN @StartDate AND @Enddate AND vps.rolename = @VolStatus and DATEDIFF(d, chc.ReceiveDate, chc.PreClrDate) BETWEEN 0 and 7