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
分享到:
相关推荐
SQL Server推荐使用 SET 而不是 SELECT 对变量进行赋值。当表达式返回一个值并对一个变量进行赋值时,推荐使用 SET 方法。下表列出 SET 与 SELECT 的区别。请特别注意红色部分。 set select 同时对多个变量...
最近的项目写的SQL比较多,经常会用到对变量赋值,而我使用SET和SELECT都会达到效果。 那就有些迷惑,这两者有什么区别呢?什么时候哪该哪个呢? 经过网上的查询,及个人练习,总结两者有以下几点主要区别: 假定有...
SELECT和SET在SQL SERVER中都可以用来对变量进行赋值,但其用法和效果在一些细节上有些不同。 1. 在对变量赋值方面,SET是ANSI标准的赋值方式,SELECT则不是。这也是SET方式被推荐使用的原因之一。 2. SELECT可以一...
最近的项目写的SQL比较多,经常会用到对变量赋值,而我使用SET和SELECT都会达到效果。那就有些迷惑,这两者有什么区别呢?什么时候哪该哪个呢?经过网上的查询,及个人练习,总结两者有以下几点主要区别:假定有设定...
可以使用SET或者SELECT语句给变量赋值。以下的例子用于将一个int类型的变量@MyNumber传递给SQRT()函数: DECLARE @MyNumber int SET @MyNumber=144 SELECT SQRT(@MyNumber) 结果是12,即144的平方根。 用SET给变量...
在函数和储存过程中使用的变量declear declear a int unsigned default 1; 这种变量需要设置变量类型 而且只存在在 begin..end 这段之内 select .. into.. 直接将表内内容赋值到指定变量当中 select name,bid ...
drop PROCEDURE if exists my_procedure; create PROCEDURE my_procedure() BEGIN declare my_sqll varchar(500);... 您可能感兴趣的文章:mysql 存储过程中变量的定义与赋值操作mysql存储过程详解mysq
从DB中取检索值传递给shell,生成环境变量 1. 编写myshellpara.sql 通过spool 执行一个SQL读取所要的值,结果保存在myshellvar_export.sh set feedback off; set heading off; set pagesize 0; set linesize 1000; ...
–把LikeSql变量赋值,可以赋值成’%xxxxxxxxxxxx%’ declare @SelectSql nvarchar(128)–定义Sql语句,开始拼Sql set @SelectSql = ‘select * from Table where [Column] like @LikePar’;—使用@LikePar变量进行...
一.脚本基础 1.USE语句 设置当前数据库。 2.声明变量 语法:DECLARE @变量名 变量类型 在声明变量后,给变量赋值之前,变量的值为NULL。 将系统函数赋给声明的变量,这个方法可以使...给变量赋值 SET:当进行变
mysql局部变量,只能用在begin/end语句块中,比如存储过程中的begin/end语句块。 其作用域仅限于该语句块。 — declare语句专门用于定义局部变量,可以使用default来说明默认值 declare age int default 0; — 局部...
VB利用变量查询日期型数据,结合SQLServer数据库实现的,可根据出生日期查询学生信息。查询部分的具体代码如下: Private Sub Cmd_Find_Click() '【查询】按钮 If Text1.Text = "" Then MsgBox "请输入要查询...
通常我们并不对视图的数据做修改操作,因为视图是一张虚拟的表,它并不存储实际数据。如果想让视图不被修改,可以用with check option来完成限制。 create or replace view view_temp as select * from temp with ...
不只在set和update时时赋值的作用,在select也是赋值的作用。 下面是:=和=的在select时作用对比 sql set @num = 0; SELECT @num := @num+1 AS rowno, nc as nickname from table_user; 结果 sql set @num = ...
可以使用DEFINE命令设置系统变量EDITOR来改变文本编辑器的类型,在login.sql文件中定义如下一行 DEFINE_EDITOR=vi f、运行命令文件 SQL>START test SQL>@test 常用SQL*Plus语句 a、表的创建、修改、删除 创建表的...