分配variables时SET与SELECT?

在T-SQL中分配variables时, SETSELECT语句之间有什么区别?

引用 ,从这篇文章中总结:

  1. SET是variables赋值的ANSI标准,SELECT不是。
  2. SET一次只能分配一个variables,SELECT可以一次做多个赋值。
  3. 如果从查询分配,SET只能分配一个标量值。 如果查询返回多个值/行,则SET将引发错误。 SELECT会将其中一个值分配给variables,并隐藏多个值被返回的事实(所以你可能永远不会知道为什么其他地方出了问题,
  4. 当从查询中分配没有返回值时,SET将分配NULL,其中SELECT根本不会进行赋值(所以variables将不会从之前的值改变)
  5. 就速度差异而言 – SET和SELECT之间没有直接的区别。 然而,SELECT在一次拍摄中进行多个分配的能力确实比SET有稍微的速度优势。

我相信SET是ANSI标准,而SELECT不是。 在下面的例子中,当没有find一个值时,还要注意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' */ 

在编写查询时,应该记住这个区别:

 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*/