存储过程中SELECT与SET对变量赋值的区别

来源:互联网 发布:头像漫画软件 编辑:程序博客网 时间:2024/05/21 01:27

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

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

下表列出 SET SELECT 的区别。

set

select

同时对多个变量同时赋值

不支持

支持

表达式返回多个值时

出错

将返回的最后一个值赋给变量

表达式未返回值

变量被赋null

变量保持原值

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

create table chinadba_a(
userid int ,
addr varchar(128)
)
go
insert into chinadba_a (userid,addr) values(1,'addr1')
insert into chinadba_a (userid,addr) values(2,'addr2')
insert into chinadba_a (userid,addr) values(3,'addr3')
go

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

declare @addr varchar(128)
set @addr = (select addr from chinadba_a)

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

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

declare @addr varchar(128)
select @addr = addr from chinadba_a
print @addr --
结果集中最后一个 addr 列的值
--
结果: addr3
go

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

declare @addr varchar(128)
set @addr = '
初始值'
set @addr = (select addr from chinadba_a where userid = 4 )
print @addr --null

go

表达式未返回值时,使用 SELECT 赋值

declare @addr varchar(128)
set @addr = '
初始值'
select @addr = addr from chinadba_a where userid = 4
print @addr --
保持原值
go

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

declare @addr varchar(128)
set @addr = '
初始值'
--select addr from chinadba_a where userid = 4
为标量子查询语句
select @addr = (select addr from chinadba_a where userid = 4)
print @addr --null

go