SQL Server 中对已经定义的变量赋值的方式用两种,分别是 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

转自:http://blog.csdn.net/shouyenet1/archive/2008/12/13/3511818.aspx

转载于:https://www.cnblogs.com/shineqiujuan/archive/2010/05/21/1740709.html

sql中 set 和select 的区别相关推荐

  1. SQL中where与having的区别

    SQL中where与having的区别 目录 SQL中where与having的区别 创建表 插入数据 进行聚合操作 # WHERE是在聚合之前进行数据行的过滤而HAVING实在聚合之后进行新数据的过 ...

  2. sql中exits和in的区别

    sql中exits和in的区别 转:http://hi.baidu.com/delphi_relive/blog/item/d7c0034a49c4932208f7ef21.html in 和 exi ...

  3. 数据库查询语句SQL中like、%、-的区别

    数据库查询语句SQL中like.%.-的区别 数据库查询语句SQL中like.%.-的区别 %百分号通配符:表示任何字符出现任意次数(可以是0次) SQL 语句选取 name 以字母 "k& ...

  4. sql中=null和is null区别

    sql中=null和is null区别 前言 关于sql语句对null的处理尤其小心,这个null处理的知识点我看了好几次,但是很容易再次犯错,这次记录一个点, 因为这个错误是我看一个帖子看到的错误的 ...

  5. SQL中modify和alter用法区别

    SQL中modify和alter用法区别 1. 所属能力大小不同: modify:只能用于修改字段的属性 例如:把age字段变为非空(针对persons表中的age这一个字段进行修改) ALTER T ...

  6. sql中exists替换in的区别

    在sql中使用exists替换in查询时要注意使用exists时一定要关联主查询和子查询的关联不然查询会得不到相应的结果如下语句:  语句一使用in查询:  select realname from ...

  7. sql 中on和where的区别

    table a(id, type): id     type ---------------------------------- 1      1 2      1 3      2 table b ...

  8. [网摘]动态SQL中set与select对变量赋值的影响

    在动态SQL中,存在着多种对字符变量赋值的方法.其中set和select使用的朋友最多.对于像我一样的小鸟来说,可能只是会用这两个方法而已,并没有真正理解这两个方法的真正内涵.我个人的理解是这样的:s ...

  9. SQL 中having 和where的区别(转)

    在select 语句中可以使用group by 子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息,另外,可以使用having子句限制返回的结果集.group by 子句可以将查询结果分 ...

最新文章

  1. 了解过去与理解现在的一把钥匙
  2. chrome浏览器测试插件postman安装
  3. 今天的绿得像碧玉的 飞鸽
  4. OpenVINO 部署 Mask-RCNN 实例分割
  5. 一文说清Elasticsearch的核心概念
  6. 【英语学习】【医学】Unit 09 The Respiratory System
  7. windows命令行启动常用工具
  8. 手把手系列|实操市场风险Var
  9. 华为全场景AI计算框架MindSpore正式开源,赋能开发者昇腾万里
  10. The operation cannot be completed. See the details.
  11. python静态方法的作用_@staticmethod和@classmethod如何作用于python中的...
  12. Android基础控件TextClock和Chronometer的使用
  13. 为什么必须在主线程操作UI
  14. android手机刷机后驱动更新失败,怎么用电脑给手机刷机 电脑刷机驱动安装失败怎么办...
  15. 真没想到!时隔3年,被废掉武功的快播,依然是最受欢迎的播放器
  16. git fatal: destination path ‘**‘ already exists and is not an empty directory.解决
  17. linux alsa 音量参数
  18. 2021保研夏令营—中科院计算所,自动化所,上海交大计算机
  19. 手把手带你免费打嘉立创pcb板
  20. 早早起来真的可以做许多事,比如再睡一觉

热门文章

  1. php处理heic格式图片,iPhone 照片为heic格式怎么处理?
  2. 2022.2.21显示器连接器引脚信号定义1
  3. LOJ #2733 [JOI2016春季合宿]Sandwiches (DP)
  4. 数码管时钟程序C语言00到99,[单片机]ACT89C51数码管时钟程序
  5. java在主程序修改函数输出,Java通过JNI调用CUDA
  6. 51nod1258 序列求和 V4(伯努利数+多项式求逆)
  7. python中变量的基本使用及命名规则
  8. 后端python基础
  9. Qt5应用改变窗口大小时出现黑影
  10. mint ui datetimepicker 手机端jquery datetimepicker 总结应用