当赋值失败时会如何?

  当赋值失败时,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的值。