2010-03-04 93 views
2

我做了一些存儲過程
時注意到一個奇怪的事情,我可以用下面的例子解釋說:爲什麼SQL變量仍然保持以前的值?

DECLARE @FileExtensionID int 

SELECT * FROM FileExtensions WHERE (Name= 'pdf') 
SELECT @FileExtensionID = ID FROM FileExtensions WHERE (Name= 'pdf') 
SELECT IsNULL(@FileExtensionID , 0) -- First Select 

SELECT * FROM FileExtensions WHERE (Name= '') 
SELECT @FileExtensionID = ID FROM FileExtensions WHERE (Name= '') 
SELECT IsNULL(@FileExtensionID , 0)-- Second Select 
在上面查詢

我稱一表「FileExtensions」用ID,名稱列和我嘗試設置在可變@FileExtensionID ID,問題是,在第一選擇 - SELECT IsNULL(@FileExtensionID,0) - @FileExtensionID具有vaild ID - 爲〔實施例9 - 丁在第二個時,沒有行從

仍然返回
SELECT @FileExtensionID = ID FROM FileExtensions WHERE (Name= '') 

它也ķ前一個 - 9 - 並沒有返回0
我不知道爲什麼會發生,所以請告訴我它是如何來的?

回答

1

如果查詢沒有返回任何行,則不會執行分配@FileExtensionID = ID,這就是爲什麼該變量仍包含之前分配的值的原因。

4

你的第二個查詢不會返回一行,所以它永遠不會被分配。

確保在每次重新使用之前「重置」變量。

DECLARE @var int; 
select @var = 3; 

print @var; 

select @var = 8 where 1=0; -- nothing happens 

print @var; 
+0

應該補充一點,上面的例子並沒有「重置」變量。它只是舉例說明了一種簡單的方式,即顯示零行使賦值@var = 8完全不會發生。 – cairnz 2010-03-04 13:31:46

0
DECLARE @FileExtensionID int 

SELECT * FROM FileExtensions WHERE (Name= 'pdf') 
SELECT @FileExtensionID = ID FROM FileExtensions WHERE (Name= 'pdf') 
SELECT IsNULL(@FileExtensionID , 0) -- First Select 

SET @FileExtensionID = NULL 

SELECT * FROM FileExtensions WHERE (Name= '') 
SELECT @FileExtensionID = ID FROM FileExtensions WHERE (Name= '') 
SELECT IsNULL(@FileExtensionID , 0)-- Second Select 

你行SELECT @FileExtensionID = ID FROM FileExtensions WHERE (Name= '')不會覆蓋@FileExtensionID如果沒有結果。

0

當您執行SELECT @Veraible = SomeField FROM SomeTable ...時,本質上它會爲從SELECT返回的每條記錄執行。所以顯然第二個SELECT(其中Name =「」)沒有返回reocrds,所以@FileExpressionID變量從不第二次更新。

0

由於標準Name = ''沒有匹配的行,所以該變量將不會被覆蓋&,因此它具有其舊值。

相關問題