`

SELECT 与 SET 对变量赋值的区别

阅读更多

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

SQL Server推荐使用 SET 而不是 SELECT 对变量进行赋值。
当表达式返回一个值并对一个变量进行赋值时,推荐使用 SET 方法。

下表列出 SET 与 SELECT 的区别。请特别注意红色部分。

 setselect
同时对多个变量同时赋值不支持支持(如:select   @a=1,@b=2,@c=3 )
表达式返回多个值时出错将返回的最后一个值赋给变量
表达式未返回值变量被赋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存储过程中SELECT 与 SET 对变量赋值的区别

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

    SQL中SET和SELECT赋值的区别

    最近的项目写的SQL比较多,经常会用到对变量赋值,而我使用SET和SELECT都会达到效果。 那就有些迷惑,这两者有什么区别呢?什么时候哪该哪个呢? 经过网上的查询,及个人练习,总结两者有以下几点主要区别: 假定有...

    何时使用SET和SELECT为变量赋值

    我们经常使用SET和SELECT来为变量赋值,但是有时候,只能选其一来使用,下面来看看这些例子,本例中使用AdventureWorks数据库来做演示。通过查询返回值:当你把查询返回的值付给变量时,SET将会接受这个结果(单值)...

    SQL SERVER中SELECT和SET赋值相同点与不同点(推荐)

    1. 在对变量赋值方面,SET是ANSI标准的赋值方式,SELECT则不是。这也是SET方式被推荐使用的原因之一。 2. SELECT可以一次对多个变量进行赋值,而SET一次只能对一个变量赋值。 DECLARE @NAME NVARCHAR(128), @AGE ...

    基于SQL中SET与SELECT赋值的区别详解

    及个人练习,总结两者有以下几点主要区别:假定有设定变量: 代码如下:DECLARE @VAR1 VARCHAR(1) DECLARE @VAR2 VARCHAR(2) 1、SELECT可以在一条语句里对多个变量同时赋值,而SET只能一次对一个变量赋值,如下: 代码...

    sql server函数大全(精析)

    可以使用SET或者SELECT语句给变量赋值。以下的例子用于将一个int类型的变量@MyNumber传递给SQRT()函数: DECLARE @MyNumber int SET @MyNumber=144 SELECT SQRT(@MyNumber) 结果是12,即144的平方根。 用SET给变量...

    从数据库中取变量传递给shell,生成环境变量

    从DB中取检索值传递给shell,生成环境变量 1. 编写myshellpara.sql 通过spool 执行一个SQL读取所要的值,结果保存在myshellvar_export.sh set feedback off; set heading off; set pagesize 0; set linesize 1000; ...

    MySQL 声明变量及存储过程分析

    set @a=’一个新变量’; 在函数和储存过程中使用的变量declear declear a int unsigned default 1; 这种变量需要设置变量类型 而且只存在在 begin..end 这段之内 select .. into.. 直接将表内内容赋值到指定...

    MySQL变量原理及应用实例

    在mysql文档中,mysql变量可分为两大类,即系统变量和用户变量。 但根据实际应用又被细化为四种类型,即局部变量、用户变量、会话变量和全局变量。 一、局部变量 mysql局部变量,只能用在begin/end语句块中,比如...

    VB利用变量查询日期型数据.rar

     MyDate = Format(Text1.Text, "short date") '给变量赋值  Adodc1.RecordSource = "select * from tb_stu where 出生年月= '" Str(MyDate) "'"  Adodc1.Refresh  Set DataGrid1.DataSource = Adodc1  End If ...

    在sp_executesql中使用like字句的方法

    –把LikeSql变量赋值,可以赋值成’%xxxxxxxxxxxx%’ declare @SelectSql nvarchar(128)–定义Sql语句,开始拼Sql set @SelectSql = ‘select * from Table where [Column] like @LikePar’;—使用@LikePar变量进行...

    MySQL中“:=”和“=”的区别浅析

    不只在set和update时时赋值的作用,在select也是赋值的作用。   下面是:=和=的在select时作用对比 sql set @num = 0; SELECT @num := @num+1 AS rowno, nc as nickname from table_user; 结果 sql set @num = ...

    mysql数据库的基本操作语法

    通常我们并不对视图的数据做修改操作,因为视图是一张虚拟的表,它并不存储实际数据。如果想让视图不被修改,可以用with check option来完成限制。 create or replace view view_temp as select * from temp with ...

    高级bash脚本编程指南(中英文合集)

    4.2. 变量赋值 4.3. Bash 变量是不分类型的 4.4. 特殊的变量类型 5. 引用(翻译的可能有问题,特指引号) 5.1. 引用变量 5.2. 转义(\) 6. 退出和退出状态 7. Tests 7.1. Test 结构 7.2. 文件测试操作 7.3. ...

    理解MySQL变量和条件

    二、变量定义和赋值  #创建数据库 DROP DATABASE IF EXISTS Dpro; CREATE DATABASE Dpro CHARACTER SET utf8 ; USE Dpro; #创建部门表 DROP TABLE IF EXISTS Employee; CREATE TABLE Employee (id INT NOT NULL ...

    《Java程序设计》课程实验指导书程序代码(答案)(实验三)

    掌握类变量与实例变量,以及类方法与实例方法的区别。 三、实验内容: 1.定义一个学生类(Student),属性有private的名字(name), public的年龄(age),专业(specialty)和封装name属性的方法:setName(),getName(),...

Global site tag (gtag.js) - Google Analytics