我不明白发生了什么事情。如何在SELECT语句中将声明变量的NULL值设置为?
DECLARE @X DATETIME;
--FIRST
SELECT @X = ContractDate
FROM dbo.Foo C
WHERE ProjectCode = 120125
AND VersionID = (SELECT MIN(VersionID)
FROM dbo.Foo
WHERE ProjectCode = C.ProjectCode)
SELECT @X
--SECOND
SELECT @X = ContractDate
FROM dbo.Foo C
WHERE ProjectCode = 130192
AND VersionID = (SELECT MIN(VersionID)
FROM dbo.Foo
WHERE ProjectCode = C.ProjectCode)
SELECT @X
第一 'SELECT @X' 必须返回 '2012年9月10日',Second'SELECT @X”必须返回 'NULL',但第二个返回 '2012年9月10日'。
第一个问题:为什么第二个'SELECT @X'返回NULL?
上面的代码块在WHILE
语句中。原来的代码是在这里:
DECLARE @ProjectCode NVARCHAR(10)
DECLARE CRS CURSOR FOR
SELECT P.ProjectCode
FROM dbo.Foo P
OPEN CRS
FETCH NEXT FROM CRS INTO @ProjectCode
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @ProjectContractDate_T0 DATETIME;
SELECT @ProjectContractDate_T0 = ContractDate
FROM dbo.FooFoo C
WHERE ProjectCode = @ProjectCode
AND VersionID = (SELECT MIN(VersionID)
FROM dbo.FooFoo
WHERE ProjectCode = C.ProjectCode)
SELECT @ProjectContractDate_T0
FETCH NEXT FROM CRS INTO @ProjectCode
END
CLOSE CRS
DEALLOCATE CRS
while循环处理:
- 时
ProjectCode = 120125
,@ProjectContractDate_T0
是 '2012年9月10日',
那么接下来
Projectcode = 130192
,@ProjectContractDate_T0
必须为NULL,但为'2012-09-10'。
这怎么可能?
在while循环中,为什么ProjectContractDate_T0
重置为NULL?
你需要打印出所有的值和调试,我把它看作是数据相关的,我们对涉及的数据没有任何想法 – TheGameiswar
这是一个经典的关于数据库的“过程式”方法,并不像说明错误的代码那样具有建设性。它应该是: SELECT P.ProjectCode,C.ContractDate FROM dbo.Foo P LEFT OUTER JOIN dbo.FooFooÇ ON( C.ProjectCode = P.ProjectCode AND C.VersionID =( SELECT MIN (VERSIONID) FROM dbo.FooFoo变量C_min WHERE C_Min.ProjectCode = P.ProjectCode ) –