`
lovexuwenhao
  • 浏览: 197185 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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

阅读更多

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中SET与SELECT赋值的区别详解

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

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

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

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

    声明变量 设置全局变量 set @a=’一个新变量’; 在函数和储存过程中使用的变量declear declear a int unsigned default 1;...这种变量需要设置变量类型 ...储存过程没有返回值,而且不能sql语句调用,只能是call调用,

    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 存储过程中执行动态SQL语句的方法

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

    在sp_executesql中使用like字句的方法

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

    MySQL变量原理及应用实例

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

    sql和oracle语法区别.doc

    1. 注释语句 --:表示从--开始,一直到行尾都属于注释 /*…*/:表示从/*到*/之间的部分都属于注释 2. 声明变量 ...Sql2000:set @var_name=value Select @var_name=value Oracle:var_name:=value

    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 ...

    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 ...

    orcale常用命令

    SQL&gt;set long 2000; 说明:可以根据视图的text_length值设定set long 的大小 SQL&gt;select text from user_views where view_name=upper('&view_name'); 6、同义词 查看同义词的名称 SQL&gt;select * from user_...

    sqlserver 脚本和批处理指令小结

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

    理解MySQL变量和条件

     变量在存储过程中会经常被使用,变量的使用方法是一个重要的知识点,特别是在定义条件这块比较重要。  mysql版本:5.6 二、变量定义和赋值  #创建数据库 DROP DATABASE IF EXISTS Dpro; CREATE DATABASE Dpro ...

Global site tag (gtag.js) - Google Analytics