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

(备注:虽然变量赋值使用方法已经不是问题,但是,了解一下select和set赋值的区别,还是提高了不少认识。应该有很多人并不熟知这一点吧)

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

SQL Server推荐使用 SET 而不是 SELECT 对变量进行赋值。
当表达式返回一个值并对一个变量进行赋值时,推荐使用 SET 方法。
下表列出 SET 与 SELECT 的区别。请特别注意红色部分。

 

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

转载于:https://www.cnblogs.com/baili-luoyun/p/11169060.html

sql server set赋值和select 赋值的区别以及使用方法相关推荐

  1. SQL Server中SET赋值和SELECT赋值的区别

    2019独角兽企业重金招聘Python工程师标准>>> 一.SELECT可以在一条语句里对多个变量同时赋值,而SET只能一次对一个变量赋值 SELECT @VAR1='Y',@VAR ...

  2. SQL Server中Text和varchar(max)数据类型区别

    SQL Server中Text和varchar(max)数据类型区别 以前只知道text和image是可能被SQL Server淘汰的数据类型,但具体原因不太清楚,今天读书的时候发现了text与var ...

  3. 如何通过SQL Server语句查询三个月内的信息代码的教程方法

    如何通过SQL Server语句查询三个月内的信息代码的教程方法 作者:张国军_Suger 开发工具与关键技术:SQL Server 2014.SQL.SQL关键字         由于需求需要我们达 ...

  4. Sql server 2005日志文件太大,使其减小的方法

    Sql server 2005日志文件太大,使其减小的方法 Sqlserver2005日志文件太大,使其减小的方法: 运行下面的三行 dbName为数据库名: backup log dbNamewit ...

  5. SQL Server服务器名称与默认实例名不一致的修复方法

    SQL Server服务器名称与默认实例名不一致的修复方法 分类: 个人累积 SQl SERVER 数据库复制2011-08-10 09:49 10157人阅读 评论(0) 收藏 举报 sql ser ...

  6. sql server 2005 学习心得(select查询语句用法)

    select * from userInfo where age like '2[25]' 功能:查询userInfo表中age字段,所有以2开头,且第二位是2或5的记录. select * from ...

  7. SQL Server中临时表与表变量的区别

    我们在数据库中使用表的时候,经常会遇到两种使用表的方法,分别就是使用临时表及表变量.在实际使用的时候,我们如何灵活的在存储过程中运用它们,虽然它们实现的功能基本上是一样的,可如何在一个存储过程中有时候 ...

  8. SQL SERVER 2005 通过链接服务器 访问 ORACLE 的快速设定方法

    1)在SQL_SERVER 2005服务器上安装Oracle 10g的客户端. 假设安装到D:\oracle\ 目录.如果D:是NTFS分区,需要将ORACLE安装后的目录设为所使用的用户有权可运行. ...

  9. SQL Server 和 MySql 语法和关键字的区别

    (1)    MySQL的ifnull()函数对应sql的isnull()函数; (2)    mysql的存储过程中变量的定义去掉@; (3)    mysql的每句结束要用";" ...

最新文章

  1. Udacity机器人软件工程师课程笔记(十五)-运动学-正向运动学和反向运动学(其二)-DH参数等
  2. CodeIgniter类库
  3. 云计算&大数据 “下一幕”智能变革之力
  4. Linux进程间通信——使用共享内存
  5. Postman发送请求时带上登录信息
  6. linux qemu运行windows,用qemu搭建CentOS 6 for colinux虚拟系统——《Windows下搭建CentOS 6开发环境之一》...
  7. SELinux系列(四)——SELinux配置文件(/etc/selinux/config)详解
  8. C# 制作一个定时关机小软件
  9. 100-网络编程——第五章流式套接字
  10. 路由器交换机防火墙无线AP基础理论知识总结
  11. linux卸载邮件服务,Zimbra在linux系统上的删除(卸载)方法
  12. acs cisco 查看log_Cisco ASA 5510 防火墙 配置笔记
  13. 【软考软件评测师】2016年下案例分析历年真题
  14. Vue组件的抽离和封装
  15. CAJ如何在线免费转换成可编辑的Word
  16. Vagrant + VMBox 踩坑记录
  17. SpringBoot + Java生成证书
  18. linux系统安装在u盘
  19. win10卸载电脑管家就蓝屏_99%的电脑都有的win10蓝屏问题,两步就能解决!
  20. 鸡兔同笼, 小明家养鸡和兔子一共36只,它们脚一共100只,那你能知道鸡和兔子各多少只么? 答案:小明家鸡22只,兔子14只。

热门文章

  1. 优先级调度算法(C++实现)
  2. 计算机教室怎样自动批量修改ip,批量设置IP地址和计算机名
  3. 蓝桥杯 历届试题 分糖果(模拟)
  4. python项目简历内容包括哪些方面_简历的基本信息包括哪些?
  5. 思科、华为、华三、Juniper路由协议优先级汇总
  6. RocketMQ 千锤百炼--哈啰在分布式消息治理和微服务治理中的实践
  7. 面对大规模 K8s 集群,如何先于用户发现问题?
  8. 函数计算自动化运维实战 3 -- 事件触发自动创建快照
  9. Knative 实践:从源代码到服务的自动化部署
  10. pdo_mysql 必须 ×未安装_php pdo_mysql未安装问题解决方法_PHP教程 | 蒲公英网