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

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

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
目录
相关文章
|
4月前
|
存储 SQL Go
sqlserver存储过程
sqlserver存储过程
|
4月前
|
存储 SQL 数据库
sqlserver中常用的几个存储过程
sqlserver中常用的几个存储过程
|
12天前
|
存储 SQL 数据库
如何使用 SQL Server 创建存储过程?
【8月更文挑战第31天】
46 0
|
3月前
|
SQL 分布式计算 前端开发
MaxCompute操作报错合集之SQL脚本设置参数set odps.mapred.reduce.tasks=18;没有生效,是为什么
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。
|
3月前
|
存储 机器学习/深度学习 SQL
SQLSERVER存储过程语法详解
SQLSERVER存储过程语法详解
92 0
|
4月前
|
存储 数据库
sqlserver------数据库的存储过程(练习)
sqlserver------数据库的存储过程(练习)
38 1
|
3月前
|
存储 关系型数据库 MySQL
mysql 存储过程游标 循环输出select 查询结果
mysql 存储过程游标 循环输出select 查询结果
42 0
|
4月前
|
SQL Oracle 关系型数据库
Oracle SQL*Plus的SET命令:你的数据库会话“调色板”
【4月更文挑战第19天】Oracle SQL*Plus的SET命令是数据库会话的“调色板”,用于设置输出格式、反馈信息和各种偏好。它能调整PAGESIZE和LINESIZE以优化显示,控制ECHO和FEEDBACK开关以定制反馈,以及统计命令执行时间(TIMING)和调试SQL(VERIFY)。更高级的选项如HEADING和COLSEP可改善输出的可读性。通过灵活运用SET命令,能提升工作效率和体验,是数据库管理员和开发者的必备工具。
|
4月前
|
存储 SQL
SQL Server 存储过程 触发器 事务处理
SQL Server 存储过程 触发器 事务处理
|
11月前
|
存储 SQL 数据库
SQLServer存储过程的执行计划
SQLServer存储过程的执行计划
99 0