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

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介:

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

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

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

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

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

None.gif create   table  chinadba1(
None.gifuserid 
int  ,
None.gifaddr 
varchar ( 128
None.gif)
None.gif
go
None.gif
insert   into  chinadba1(userid,addr)  values ( 1 , ' addr1 ' )
None.gif
insert   into  chinadba1(userid,addr)  values ( 2 , ' addr2 ' )
None.gif
insert   into  chinadba1(userid,addr)  values ( 3 , ' addr3 ' )
None.gif
go
表达式返回多个值时,使用 SET 赋值
None.gif declare   @addr   varchar ( 128 )
None.gif
set   @addr   =  ( select  addr  from  chinadba1)
ExpandedBlockStart.gif
/*
InBlock.gif--出错信息为
InBlock.gif服务器: 消息 512,级别 16,状态 1,行 2
InBlock.gif子查询返回的值多于一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。
ExpandedBlockEnd.gif
*/

None.gif
go

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

None.gif declare   @addr   varchar ( 128 )
None.gif
select   @addr   =  addr  from  chinadba1
None.gif
print   @addr   -- 结果集中最后一个 addr 列的值
None.gif--
结果: addr3 
None.gif
go
表达式未返回值时,使用 SET 赋值
None.gif declare   @addr   varchar ( 128 )
None.gif
set   @addr   =   ' 初始值 '
None.gif
set   @addr   =  ( select  addr  from  chinadba1  where  userid  =   4  )
None.gif
print   @addr   -- null值 
None.gif
go
表达式未返回值时,使用 SELECT 赋值
None.gif declare   @addr   varchar ( 128 )
None.gif
set   @addr   =   ' 初始值 '
None.gif
select   @addr   =  addr  from  chinadba1  where  userid  =   4
None.gif
print   @addr   -- 保持原值
None.gif
go

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

None.gif declare   @addr   varchar ( 128 )
None.gif
set   @addr   =   ' 初始值 '
None.gif
-- select addr from chinadba1 where userid = 4 为标量子查询语句
None.gif
select   @addr   =  ( select  addr  from  chinadba1  where  userid  =   4
None.gif
print   @addr   -- null值
None.gif
go
相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
13天前
|
JSON 数据格式 Java
化繁为简的魔法:Struts 2 与 JSON 联手打造超流畅数据交换体验,让应用飞起来!
【8月更文挑战第31天】在现代 Web 开发中,JSON 成为数据交换的主流格式,以其轻量、易读和易解析的特点受到青睐。Struts 2 内置对 JSON 的支持,结合 Jackson 库可便捷实现数据传输。本文通过具体示例展示了如何在 Struts 2 中进行 JSON 数据的序列化与反序列化,并结合 AJAX 技术提升 Web 应用的响应速度和用户体验。
31 0
|
13天前
|
存储 SQL 数据库
如何使用 SQL Server 创建存储过程?
【8月更文挑战第31天】
47 0
|
3月前
|
存储 SQL 数据库
SQL 语言:存储过程和触发器
SQL 语言:存储过程和触发器
55 6
|
3月前
|
存储 机器学习/深度学习 SQL
SQLSERVER存储过程语法详解
SQLSERVER存储过程语法详解
94 0
|
3月前
|
存储 关系型数据库 MySQL
mysql 存储过程游标 循环输出select 查询结果
mysql 存储过程游标 循环输出select 查询结果
42 0
|
3月前
|
存储 SQL Oracle
oracle 存储过程导出sql语句 导出为文件
oracle 存储过程导出sql语句 导出为文件
154 0
|
2月前
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
56 13
|
2月前
|
SQL
解锁 SQL Server 2022的时间序列数据功能
【7月更文挑战第14天】要解锁SQL Server 2022的时间序列数据功能,可使用`generate_series`函数生成整数序列,例如:`SELECT value FROM generate_series(1, 10)。此外,`date_bucket`函数能按指定间隔(如周)对日期时间值分组,这些工具结合窗口函数和其他时间日期函数,能高效处理和分析时间序列数据。更多信息请参考官方文档和技术资料。
|
2月前
|
SQL 存储 网络安全
关系数据库SQLserver 安装 SQL Server
【7月更文挑战第26天】
44 6