`
tmartin
  • 浏览: 102421 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

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

阅读更多

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

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

分享到:
评论

相关推荐

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

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

    SQL中SET和SELECT赋值的区别

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

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

    SELECT和SET在SQL SERVER中都可以用来对变量进行赋值,但其用法和效果在一些细节上有些不同。 1. 在对变量赋值方面,SET是ANSI标准的赋值方式,SELECT则不是。这也是SET方式被推荐使用的原因之一。 2. SELECT可以一...

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

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

    sql server函数大全(精析)

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

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

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

    MySQL 存储过程中执行动态SQL语句的方法

    drop PROCEDURE if exists my_procedure; create PROCEDURE my_procedure() BEGIN declare my_sqll varchar(500);... 您可能感兴趣的文章:mysql 存储过程中变量的定义与赋值操作mysql存储过程详解mysq

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

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

    在sp_executesql中使用like字句的方法

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

    sqlserver 脚本和批处理指令小结

    一.脚本基础 1.USE语句 设置当前数据库。 2.声明变量 语法:DECLARE @变量名 变量类型 在声明变量后,给变量赋值之前,变量的值为NULL。 将系统函数赋给声明的变量,这个方法可以使...给变量赋值 SET:当进行变

    MySQL变量原理及应用实例

    mysql局部变量,只能用在begin/end语句块中,比如存储过程中的begin/end语句块。 其作用域仅限于该语句块。 — declare语句专门用于定义局部变量,可以使用default来说明默认值 declare age int default 0; — 局部...

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

    VB利用变量查询日期型数据,结合SQLServer数据库实现的,可根据出生日期查询学生信息。查询部分的具体代码如下:  Private Sub Cmd_Find_Click() '【查询】按钮  If Text1.Text = "" Then  MsgBox "请输入要查询...

    mysql数据库的基本操作语法

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

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

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

    orcale常用命令

    可以使用DEFINE命令设置系统变量EDITOR来改变文本编辑器的类型,在login.sql文件中定义如下一行 DEFINE_EDITOR=vi f、运行命令文件 SQL&gt;START test SQL&gt;@test 常用SQL*Plus语句 a、表的创建、修改、删除 创建表的...

Global site tag (gtag.js) - Google Analytics