SQL SERVER 变量赋值

SQL Server 中对已经定义的变量赋值的方式用两种,分别是 SET SELECT

对于这两种方式的区别,SQL Server 联机丛书中已经有详细的说明,但很多时候我们

并没有注意,其实这两种方式还是有很多差别的。

SQL Server推荐使用 SET 而不是 SELECT 对变量进行赋值。

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

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

 

set

select

同时对多个变量同时赋值

不支持

支持

表达式返回多个值时

出错

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

表达式未返回值

变量被赋null

变量保持原值

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

createtable chinadba1(

useridint ,

addrvarchar(128)

)

go

insertinto chinadba1(userid,addr) values(1,'addr1')

insertinto chinadba1(userid,addr) values(2,'addr2')

insertinto 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 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值