【问题标题】:Variable inside subquery not receiving variable value子查询中的变量未接收变量值
【发布时间】:2013-04-04 16:00:29
【问题描述】:

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

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

我的错,我发布了我正在玩的早期测试脚本,确实充满了错误,对此感到抱歉。这是我正在使用的完整代码:

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 的值似乎没有进入子查询。我是否需要做一些事情来告诉潜艇要跳出框框?

【问题讨论】:

  • 您遇到什么错误?您确定同时运行所有代码吗?您不能运行 declare 然后运行子查询 - 定义仅在运行的语句中持续。
  • 看起来这不是所有代码 - 那里有一个 UNION。如果您按照此处所写的方式运行所有这些,则会因语法错误而失败。
  • 如果不设置@VolStatus,它将为NULL。根据您的 ANSI_NULL 设置,您可能会或可能不会获得数据...不过我猜这可能是您的问题。
  • 拜托,您真的不应该将BETWEEN 与日期/时间/时间戳类型一起使用especially on SQL Server。真的,考虑时间的方式是错误的,不管 RDBMS 可能有任何...违规行为。
  • @Clockwork-Muse - 我应该怎么做?

标签: sql sql-server tsql


【解决方案1】:

两个问题:

  1. 您没有为 volStatus 分配值
  2. 应该是 @volstatus 而不是 @ volstatus - 没有空格

所以,改变:

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

收件人:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多