当赋值失败时会如何?
当赋值失败时,SET和SELECT 的行为是不一样的。这里的赋值失败可能是没有数据或者数据类型不配等。此时SELECT会返回上一个值(如果上一个值已经赋值成功),而SET会把NULL赋值给变量。不管如何,这种失败的赋值都会产生不可预计的结果,所以需要细心处理。
下面来看看例子:
USE AdventureWorks GO -- 展示SET赋值失败的情景 DECLARE @var1 VARCHAR(20) SET @var1 = 'Value 1 Assigned' PRINT @var1 SET @var1 = (SELECT Color FROM Production.Product WHERE ProductID = 32022) PRINT @var1 GO -- 展示SELECT赋值失败的情景 DECLARE @var1 VARCHAR(20) SELECT @var1 = 'Value 1 Assigned' PRINT @var1 SELECT @var1 = Color FROM Production.Product WHERE ProductID = 32023 PRINT @var1 GO |
结果如下:
从结果中可以看出当SET失败时,返回NULL,而SELECT失败时会返回上一个结果。
标准:
很多时候,使用SELECT是一个不错的选择,但是用SELECT来赋值并不符合ANSI标准,所以如果要遵循标准(可能因为要移植代码到别的DBMS),应该使用SET来替代SELECT 。
总结:
其实最好的方法还是通过实践来证明。很多时候的确可以混用,但是有些时候还是建议单独使用:
使用SET的情景:
● 需要直接赋值,且不需要任何查询,比如变量初始化。
● 故意赋予NULL值。
● 为了将来的移植而遵循ANSI标准。
● 赋予非标量值。
使用SELECT的情景:
● 直接赋予多值变量。
● 通过查询来赋予变量(单值或多值均可)。
● 检查编码量。
● 为了获取变量如@@ROWCOUNT和@@ERROR的值。