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