何が起こっているのか分かりません。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日。
最初の質問:なぜ2番目の '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
ループであるが処理:
ProjectCode = 120125
は、@ProjectContractDate_T0
が '2012年9月10日' である、
次いで次
Projectcode = 130192
、@ProjectContractDate_T0
はNULLにする必要がありますが、 '2012-09-10'です。
どのようにすることができますか?
whileループでは、なぜProjectContractDate_T0
がNULLにリセットされませんでしたか?
私はこれをデータ関連として表示します。関連するデータについては何も考えていません。 – TheGameiswar
これはリレーショナルデータベースに対する古典的な手続き型アプローチであり、悪いコードを示すようには建設的ではありません。それがなければならない:dbo.Foo P LEFT OUTERは( C.ProjectCode = P.ProjectCode AND C.VersionID =( MINを選択ON dbo.FooFoo C をJOIN FROM SELECT P.ProjectCode、C.ContractDate dbo.FooFoo C_Min FROM(VERSIONID) WHERE C_Min.ProjectCode = P.ProjectCode ) –