Wor*_*ead 22 sql t-sql sql-server sql-server-2005
编辑:我的问题是源于我的代码中的参数顺序混合.我真诚地感谢大家的帮助; 每次访问SO时,我的SQL理解都会变得更好.
我正在编写一个存储过程,需要从另一个表中选择一些信息才能完成它的工作.
DECLARE @configVar int;
SET @configVar = (SELECT ExampleSetting FROM Settings WHERE SettingID = 1);
-- do something with @configVar to get the final result set
Run Code Online (Sandbox Code Playgroud)
显然(对于对SQL有更好理解的人),上述内容是不正确的.没有错误,除了执行存储过程时,@ configVar设置为NULL.我已经仔细检查了我正在选择的表,并确保数据存在.
有人可以告诉我我的误解在哪里,以及我该如何纠正它?看起来这可能是一个常见的习语; 这通常是如何实现的?
OMG*_*ies 37
TSQL允许您使用以下方法在SELECT子句中设置变量:
SELECT @configVar = s.examplesetting
FROM SETTINGS s
WHERE s.settingid = 1
Run Code Online (Sandbox Code Playgroud)
这假设表中只有一条记录值为1的记录.
有关使用的更多信息,请参阅问题" TSQL - 分配变量时的SET与SELECT? ".
Ric*_*iwi 13
显然(对于对SQL有更好理解的人),上述内容是不正确的.
你怎么会那么说?它完全有效,即使它可以写成
SELECT @configVar = ExampleSetting FROM Settings WHERE SettingID = 1;
Run Code Online (Sandbox Code Playgroud)
事实上,当有多行返回时(尝试下一个查询),它会在第一种形式中给你一个错误,它让你知道某些东西不是你所期望的,而上面的第二个查询通过使用来自的ExampleSpting值静默地工作.最后匹配的记录.
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.
Run Code Online (Sandbox Code Playgroud)
独自运行它,你可能会看到令你惊讶的东西
SELECT ExampleSetting FROM Settings WHERE SettingID = 1
Run Code Online (Sandbox Code Playgroud)
如果没有返回记录,那就是为什么SET @configVar留空
仅供参考,这是我尝试过的,它像宣传的那样工作
DECLARE @configVar int;
SET @configVar = (SELECT top 1 number FROM master..spt_values);
select @configVar;
-- result: -32768
Run Code Online (Sandbox Code Playgroud)
为什么要使用SELECT @var表单而不是SET from subquery表单的一个例外是,当查询找不到匹配的行时,第一个单独留下变量,第二个显式地将它设置为null.
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
Run Code Online (Sandbox Code Playgroud)
DECLARE @configVar int;
SELECT @configVar = ExampleSetting FROM Settings WHERE SettingID = 1
Run Code Online (Sandbox Code Playgroud)