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

本文涉及的产品
云数据库 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
目录
相关文章
|
1月前
|
存储 SQL Go
sqlserver存储过程
sqlserver存储过程
19 0
|
1月前
|
存储 SQL 数据库
sqlserver中常用的几个存储过程
sqlserver中常用的几个存储过程
48 0
|
2月前
|
SQL 数据库
20、绕过去除and、or、union select、空格的sql注入
20、绕过去除and、or、union select、空格的sql注入
32 0
|
3月前
|
SQL 存储 关系型数据库
sql语句,索引,视图,存储过程
sql语句,索引,视图,存储过程
30 0
|
2月前
|
SQL 关系型数据库 MySQL
MySQL技能完整学习列表3、SQL语言基础——1、SQL(Structured Query Language)简介——2、基本SQL语句:SELECT、INSERT、UPDATE、DELETE
MySQL技能完整学习列表3、SQL语言基础——1、SQL(Structured Query Language)简介——2、基本SQL语句:SELECT、INSERT、UPDATE、DELETE
51 0
|
3月前
|
存储 SQL 缓存
4.2.1 SQL语句、索引、视图、存储过程
4.2.1 SQL语句、索引、视图、存储过程
|
1月前
|
存储 SQL 数据库
sql serve存储过程
sql serve存储过程
14 0
|
1月前
|
SQL 存储 关系型数据库
SQL的基本语法以及SQL语句的关键字的使用,SELECT、INSERT、UPDATE、DELETE、CREATE、ALTER、DROP等。
SQL的基本语法以及SQL语句的关键字的使用,SELECT、INSERT、UPDATE、DELETE、CREATE、ALTER、DROP等。
|
30天前
|
SQL 关系型数据库 MySQL
SQL INSERT INTO order_record SELECT * FROM 从一张表查出数据插入到另一张表
SQL INSERT INTO order_record SELECT * FROM 从一张表查出数据插入到另一张表
14 0
|
1月前
|
存储 SQL
物料清单应用输入模板的SQL存储过程设计
物料清单应用输入模板的SQL存储过程设计