• 售前

  • 售后

热门帖子
入门百科

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

[复制链接]
压后牙 显示全部楼层 发表于 2021-10-26 12:37:07 |阅读模式 打印 上一主题 下一主题
SQL Server保举利用 SET 而不是 SELECT 对变量举行赋值。
当表达式返回一个值并对一个变量举行赋值时,保举利用 SET 方法。
下表列出 SET 与 SELECT 的区别。请特殊留意赤色部分。

setselect
同时对多个变量同时赋值不支持支持
表达式返回多个值时堕落将返回的最后一个值赋给变量
表达式未返回值变量被赋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

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作