2010-03-04 56 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 = ''没有匹配的行,所以该变量将不会被覆盖&,因此它具有其旧值。

相关问题