存储过程中SELECT与SET对变量赋值 - 11GX
首页 > 存储过程中SELECT与SET对变量赋值

存储过程中SELECT与SET对变量赋值

Create proc insert_book
@param1char(10),@param2varchar(20),@param3money,@param4moneyoutput
with encryption---------加密
as
insert into book(编号,书名,价格)Values(@param1,@param2,@param3)
select @param4=sum(价格) from book
go
执行例子:
declare @total_price money
exec insert_book '003','Delphi控件开发指南',$100,@total_price output
print '总金额为'+convert(varchar,@total_price)
go

 

 

 

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

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

下表列出 SET 与 SELECT 的区别。

 

 

set

select

同时对多个变量同时赋值

不支持

支持

表达式返回多个值时

出错

将返回的最后一个值赋给变量

表达式未返回值

变量被赋null值

变量保持原值

下面以具体示例来说明问题:

create table chinadba_a(

userid int ,

addr varchar(128) 

)

go

insert into chinadba_a (userid,addr) values(1,'addr1')

insert into chinadba_a (userid,addr) values(2,'addr2')

insert into chinadba_a (userid,addr) values(3,'addr3')

go

表达式返回多个值时,使用 SET 赋值

declare @addr varchar(128)

set @addr = (select addr from chinadba_a)

/*

出错信息为,服务器: 消息 512,级别 16,状态 1,行 2。子查询返回的值多于一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。

*/

go

表达式返回多个值时,使用 SELECT 赋值

declare @addr varchar(128)

select @addr = addr from chinadba_a

print @addr --结果集中最后一个 addr 列的值

--结果: addr3 

go

表达式未返回值时,使用 SET 赋值

declare @addr varchar(128)

set @addr = '初始值'

set @addr = (select addr from chinadba_a where userid = 4 )

print @addr --null值 

go

表达式未返回值时,使用 SELECT 赋值

declare @addr varchar(128)

set @addr = '初始值'

select @addr = addr from chinadba_a where userid = 4

print @addr --保持原值

go

需要注意的是,SELECT 也可以将标量子查询的值赋给变量,如果标量子查询不返回值,则变量被置为 null 值。此时与 使用 SET 赋值是完全相同的对标量子查询的概念大家应该都觉得陌生,举个例子就能说明

declare @addr varchar(128)

set @addr = '初始值'

--select addr from chinadba_a where userid = 4 为标量子查询语句

select @addr = (select addr from chinadba_a where userid = 4) 

print @addr --null值

go

转载于:https://www.cnblogs.com/hushzhang/p/7542645.html

更多相关:

  •     socket这个词可以表示很多概念: 在TCP/IP协议中,“IP地址+TCP或UDP端口号”唯一标识网络通讯中的一个进程,“IP地址+端口号”就称为socket。 在TCP协议中,建立连接的两个进程各自有一个socket来标识,那么这两个socket组成的socket pair就唯一标识一个连接。 socket本身有“插座”...

  • empty()函数 是用来测试变量是否已经配置。若变量已存在、非空字符串或者非零,则返回 false 值;反之返回 true值。所以,当字符串的值为0时,也返回true,就是执行empty内部的语句。这就是陷阱。     如: 假设 $value = 0; 则empty($value)=false。     劝告各位,千万注意使用...

  • (四)Asp.net web api中的坑-【api的返回值】 原文:(四)Asp.net web api中的坑-【api的返回值】void无返回值IHttpActionResultHttpResponseMessage自定义类型我这里并不想赘述这些返回类型, 可以参考博文http://blog.csdn.net/leonk...

  • 今天碰见个题目,感觉短路表达式很好用。 题目: 定义一个计算圆面积的函数area_of_circle(),它有两个参数:r: 表示圆的半径;pi: 表示π的值,如果不传,则默认3.14function area_of_circle(r, pi) {} 我的写法:  if(arguments.length>=2) { ret...

  • 类型 JavaScript 有七种内置类型:null、undefined、boolean、number、string、object 和symbol,可以使用typeof 运算符来查看typeof返回的都是字符串很多开发人员将undefined 和undeclared 混为一谈, 但在JavaScript 中它们是两码事。undefin...

  • 什么是DOM document object model 的简称,意思为文档对象模型。主要用来对文档中的html节点进行操作。 Dom的操作简单示例:

    -->