2010-10-15 100 views

回答

338

Quote,它从this article总结:

  1. SET为变量赋值ANSI标准,SELECT不是。
  2. SET一次只能分配一个变量,SELECT可以一次做多个赋值。
  3. 如果从查询分配,SET只能分配一个标量值。如果查询返回多个值/行,则SET将引发错误。 SELECT会将其中一个值分配给变量,并隐藏返回多个值的事实(因此您可能永远不会知道为什么某处出错了) -
  4. 从查询中分配时是否存在是没有值返回然后SET将分配NULL,其中SELECT不会完成任务(因此变量将不会从其以前的值更改)
  5. 就速度差异 - SET和SELECT之间没有直接差异。然而,SELECT在一次拍摄中进行多个分配的能力确实比SET有稍微的速度优势。
+3

我没有downvote,但下面是不太正确的:“至于速度的差异 - 有没有直接的差异SET和SELECT之间“。如果您一次分配多个值,那么通过多个集合可以快得多。 Google up“使用一个SELECT分配多个变量的速度更快” – 2010-10-15 19:53:52

+11

@AlexKuznetsov:之后的句子表明了这一点。 – 2010-10-15 19:59:21

+1

@OMG小马:它可以快10倍或更多,所以我不确定它是否“轻微的速度优势”。 – 2010-10-15 20:22:18

121

我相信SET是ANSI标准,而SELECT不是。在下面的示例中,如果找不到值,请注意SETSELECT的不同行为。

declare @var varchar(20) 
set @var = 'Joe' 
set @var = (select name from master.sys.tables where name = 'qwerty') 
select @var /* @var is now NULL */ 

set @var = 'Joe' 
select @var = name from master.sys.tables where name = 'qwerty' 
select @var /* @var is still equal to 'Joe' */ 
+4

+1最好是运行一次才能理解,检查,播放,记住它只读,但其他答案只是文本 – 2010-10-16 07:36:44

+4

如果您实际使用'select @var =(从master.sys.tables中选择名称,其中名称='qwerty')'你会得到@var为空。你给的例子不是同一个查询。 – Zack 2015-06-01 14:55:56

+4

@Zack你完全错过了这个例子的要点。 – 2015-06-01 17:11:29

16

在编写查询,这种差异应牢记:

DECLARE @A INT = 2 

SELECT @A = TBL.A 
FROM (SELECT 1 A) TBL 
WHERE 1 = 2 

SELECT @A 
/* @A is 2*/ 

--------------------------------------------------------------- 

DECLARE @A INT = 2 

SET @A = ( 
      SELECT TBL.A 
      FROM (SELECT 1 A) TBL 
      WHERE 1 = 2 
     ) 

SELECT @A 
/* @A is null*/ 
+0

非常好,简洁 – SimplyInk 2018-02-26 06:02:51