何时使用SET和SELECT为变量赋值

发表于:2013-1-16 09:54

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:黄钊吉    来源:51Testing软件测试网采编

  当赋值失败时会如何?

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

33/3<123
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号