SELECT 与 SET 对变量赋值的区别

SQL   Server   中对已经定义的变量赋值的方式用两种,分别是   SET   和   SELECT。 
对于这两种方式的区别,SQL   Server   联机丛书中已经有详细的说明,但很多时候我们 
并没有注意,其实这两种方式还是有很多差别的。 

SQL   Server推荐使用   SET   而不是   SELECT   对变量进行赋值。 
当表达式返回一个值并对一个变量进行赋值时,推荐使用   SET   方法。 

下表列出   SET   与   SELECT   的区别。请特别注意红色部分。   

    set   select   
同时对多个变量同时赋值   不支持   支持   
表达式返回多个值时   出错   将返回的最后一个值赋给变量   
表达式未返回值   变量被赋null值   变量保持原值   

下面以具体示例来说明问题: 

create   table   chinadba1( 
userid   int   , 
addr   varchar(128)   

go 
insert   into   chinadba1(userid,addr)   values(1, 'addr1 ') 
insert   into   chinadba1(userid,addr)   values(2, 'addr2 ') 
insert   into   chinadba1(userid,addr)   values(3, 'addr3 ') 
go 


表达式返回多个值时,使用   SET   赋值   

declare   @addr   varchar(128) 
set   @addr   =   (select   addr   from   chinadba1) 
/* 
--出错信息为 
服务器:   消息   512,级别   16,状态   1,行   2 
子查询返回的值多于一个。当子查询跟随在   =、!=、 <、 <=、> 、> =   之后,或子查询用作表达式时,这种情况是不允许的。 
*/ 
go 

表达式返回多个值时,使用   SELECT   赋值   
declare   @addr   varchar(128) 
select   @addr   =   addr   from   chinadba1 
print   @addr   --结果集中最后一个   addr   列的值 
--结果:   addr3   
go 


表达式未返回值时,使用   SET   赋值   
declare   @addr   varchar(128) 
set   @addr   =   '初始值 ' 
set   @addr   =   (select   addr   from   chinadba1   where   userid   =   4   ) 
print   @addr   --null值   
go 


表达式未返回值时,使用   SELECT   赋值   
declare   @addr   varchar(128) 
set   @addr   =   '初始值 ' 
select   @addr   =   addr   from   chinadba1   where   userid   =   4 
print   @addr   --保持原值 
go 


需要注意的是,SELECT   也可以将标量子查询的值赋给变量,如果标量子查询不返回值,则变量被置为   null   值。 
此时与   使用   SET   赋值是完全相同的 
对标量子查询的概念大家应该都觉得陌生,举个例子就能说明 

declare   @addr   varchar(128) 
set   @addr   =   '初始值 ' 
--select   addr   from   chinadba1   where   userid   =   4   为标量子查询语句 
select   @addr   =   (select   addr   from   chinadba1   where   userid   =   4)   
print   @addr   --null值 
go
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值