分配variables时SET与SELECT?
在T-SQL中分配variables时, SET
和SELECT
语句之间有什么区别?
引用 ,从这篇文章中总结:
- SET是variables赋值的ANSI标准,SELECT不是。
- SET一次只能分配一个variables,SELECT可以一次做多个赋值。
- 如果从查询分配,SET只能分配一个标量值。 如果查询返回多个值/行,则SET将引发错误。 SELECT会将其中一个值分配给variables,并隐藏多个值被返回的事实(所以你可能永远不会知道为什么其他地方出了问题,
- 当从查询中分配没有返回值时,SET将分配NULL,其中SELECT根本不会进行赋值(所以variables将不会从之前的值改变)
- 就速度差异而言 – SET和SELECT之间没有直接的区别。 然而,SELECT在一次拍摄中进行多个分配的能力确实比SET有稍微的速度优势。
我相信SET
是ANSI标准,而SELECT
不是。 在下面的例子中,当没有find一个值时,还要注意SET
与SELECT
的不同行为。
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*/