显然(对于对 SQL 有更好理解的人来说),以上是不正确的。
为什么要这么说?完全有效,即使可以写成
SELECT @configVar = ExampleSetting FROM Settings WHERE SettingID = 1;
事实上,当返回多行时(尝试下一个查询),它会在第一种形式中给您一个错误,这让您知道某些事情不是您所期望的,而上面的第二个查询静默 em> 使用最后匹配记录中的 ExampleSetting 值工作。
DECLARE @configVar int;
SET @configVar = (SELECT number FROM master..spt_values);
-- Msg 512, Level 16, State 1, Line 2
-- Subquery returned more than 1 value.
自行运行,您可能会看到令您惊讶的东西
SELECT ExampleSetting FROM Settings WHERE SettingID = 1
如果这不返回任何记录,这就是SET @configVar 保留为 NULL 的原因
仅供参考,这是我尝试过的,并且效果与宣传的一样
DECLARE @configVar int;
SET @configVar = (SELECT top 1 number FROM master..spt_values);
select @configVar;
-- result: -32768
使用SELECT @var 表单而不是SET from subquery 表单的一个例外是,当查询找不到匹配的行时,第一个将变量单独保留,第二个将其显式设置为空。
DECLARE @configVar int;
SET @configVar = 123;
SET @configVar = (SELECT top 1 number FROM master..spt_values where 1=0);
select @configVar; -- @configVar was set to NULL
SET @configVar = 123;
SELECT top 1 @configVar = number FROM master..spt_values where 1=0;
select @configVar; -- @configVar is LEFT as 123