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

时间:2024-01-14 09:50:26 

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

标签:sqlserver,存储过程
0
投稿

猜你喜欢

  • MySQL高效分页解决方案集分享

    2024-01-26 09:29:36
  • asp+XMLHTTP的国际域名查询系统(whois)源代码

    2008-02-16 09:23:00
  • SQL学习笔记一SQL基础知识

    2011-09-30 11:24:33
  • Python文本相似性计算之编辑距离详解

    2022-04-28 12:14:23
  • CSS兼容IE6,IE7,FF的技巧

    2010-04-01 12:34:00
  • Python异常信息的不同展现方法总结

    2021-02-20 10:14:26
  • python用opencv完成图像分割并进行目标物的提取

    2023-12-04 21:31:29
  • Vue Router根据后台数据加载不同的组件实现

    2023-07-02 16:59:14
  • escape、encodeURI、encodeURIComponent等方法的区别比较

    2024-05-13 09:36:40
  • 在linux系统下安装python librtmp包的实现方法

    2021-05-08 21:13:50
  • JS HTML5拖拽上传图片预览

    2024-04-22 13:03:38
  • Flask 使用工厂模式

    2021-10-01 01:52:58
  • Python中的if判断语句中包含or问题

    2021-12-03 14:30:21
  • 如何决定是否将登录内容保存到Cookie里?

    2009-12-16 18:54:00
  • python 用正则表达式筛选文本信息的实例

    2023-04-29 14:12:26
  • python 实现网上商城,转账,存取款等功能的信用卡系统

    2022-05-26 15:19:36
  • Python定时发送消息的脚本:每天跟你女朋友说晚安

    2023-05-26 02:47:14
  • MySQL 行锁和表锁的含义及区别详解

    2024-01-23 10:06:11
  • 对python 通过ssh访问数据库的实例详解

    2024-01-16 07:32:12
  • 在Sublime Editor中配置Python环境的详细教程

    2023-08-14 08:33:26
  • asp之家 网络编程 m.aspxhome.com