`

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`,因为它的行为更加明确和一致。`SET`语句一次只能为一个变量赋值,而且如果表达式不返回任何值,变量将保持其原始值。这意味着,如果尝试用`SET`给变量赋一个...

    SQL中SET和SELECT赋值的区别

    如果需要对多个变量赋值,需要使用多个 SET 语句。SELECT 则不同,它可以在一条语句中对多个变量同时赋值。 例如,假定有两个变量 @VAR1 和 @VAR2,使用 SELECT 可以这样赋值: SELECT @VAR1='Y',@VAR2='N' 而...

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

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

    SQL变量声明和赋值知识归纳

    SQL提供了几种不同的方式来给变量赋值: 1. **使用SET语句**: ```sql SET @variable_name = value; ``` 这里,`value`可以是常量、表达式或另一个变量的值。 2. **使用SELECT语句**: ```sql SELECT @...

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

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

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

    而`SELECT`可以一次性给多个变量赋值,例如: ```sql DECLARE @NAME NVARCHAR(128), @AGE INT; SELECT @NAME = N'小明', @AGE = 18; ``` 3. **子查询赋值**:在使用子查询为变量赋值时,`SET`要求子查询必须...

    mysql存储过程之创建(CREATE PROCEDURE)和调用(CALL)及变量创建(DECLARE)和赋值(SET)操作方法

    为变量赋值通常使用`SET`语句,例如: ```sql DECLARE total_count INT DEFAULT 0; SET total_count = 10; ``` 这里将`total_count`的值设为了10。此外,`SELECT INTO`也可以用来将查询结果赋值给变量: ```sql ...

    TSQL语言局部变量(共11张PPT).ppt

    可以使用SET语句或SELECT语句为局部变量赋值。 例如,使用SET语句为局部变量赋值: DECLARE @var1 datetime SET @var1 = getdate() 使用SET语句将查询结果赋给局部变量: DECLARE @date_var datetime SET @date_...

    动态SQL 并且把返回的值赋给变量

    本文将详细介绍如何利用`sp_executesql`来执行动态SQL,并重点讨论如何将执行结果赋值给变量,以及一些重要的注意事项。 #### 动态SQL与`sp_executesql` 动态SQL是指在运行时构建的SQL语句,这种类型的SQL可以在不...

    mysql 存储过程中变量的定义与赋值操作

    1. **直接赋值**:使用`SET`语句来给变量赋值。它可以是常量、表达式,甚至可以是其他变量的值。例如: ```sql SET last = DATE_SUB(CURDATE(), INTERVAL 1 MONTH); ``` 2. **查询赋值**:当查询结果只有一行时...

    Oracle 变量替换 很实用的

    在Oracle SQL*Plus环境中,可以通过`DEFINE`命令来显式地为变量赋值。例如: ``` DEFINE myv='King' ``` 这条命令创建了一个名为`myv`的字符型变量,并将其值设置为“King”。 ##### 2.2 使用ACCEPT命令接受输入 ...

    数据库管理与应用常量和变量.doc

    也可以通过 SELECT 语句的选择列表中当前所引用值为变量赋值。 例如,下面的批处理声明一个变量、为它赋值并在 SELECT 语句的 WHERE 子句中予以使用: USE students GO DECLARE @NAME CHAR(8) SET @NAME='张三 ' ...

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

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

Global site tag (gtag.js) - Google Analytics