获得存储过程返回值和输出参数有什么不同

dotnet 获得存储过程返回值和输出参数有什么不同 @@IDENTITY SCOPE_IDENTITY();
2009-03-18 21:42

存储过程1:
Create PROCEDURE CreateNewUser
@UserName varchar(50),
@Password varchar(50),
@Description varchar(50)
AS
INSERT INTO [User](Email, Password, Description)VALUES(@UserName, @Password, @Description)
RETURN
@@IDENTITY

存储过程2:
Create PROCEDURE CreateNewUser
@UserName varchar(50),
@Password varchar(50),
@Description varchar(50)
@UserID
int output
AS
INSERT INTO [User](Email, Password, Description)VALUES(@UserName, @Password, @Description)
SET @UserID = @@IDENTITY
RETURN 1

两个存储过程的不同之处在于第一个没有输出参数,我用
comm.Parameters.Add(new SqlParameter("ReturnValue",SqlDbType.Int,4,ParameterDirection.ReturnValue,false,0,0,string.Empty,DataRowVersion.Default,null));
ReturnValue=(int)comm.Parameters["ReturnValue"].Value;

结果:调用这两个存储过程都可以得到返回的ID.
请问:
1.用输出参数有什么用途,是不是可以返回多个输出参数.
2.当需要返回一个值时,用return 用户ID 和用输出参数@用户ID int output有什么不同?
3.当我定义了一个输出参数,又在存储过程结尾设置return '某个值',存储过程返回的一定是输出参数的值吗?

1,是的,可以有多个多种类型的输出参数,而返回值只能有1个整型的;
2,没什么不同,不过RETURN @@IDENTITY在并发时会出错,应该使用return SCOPE_IDENTITY();
3,是两个不同的参数,并无什么联系。
Top

返回值只能是一个叫@ReturnValue的整型值。
输出参数可以自己定义多个。
Top

1。是的,就像你输入一个用户编号,可以返回用户的所有的注册信息
2。Return返回值只能是一个,
而用output可以是多个,如果你有多个output的话,你可以返回一个数组
3.没有什么关系的,如你输入一个用户编号,你可以返回他的姓名或者是地址什么的
Top

return只能返回一个int型的值,而且一旦出现return,储存过程就结束了

而用output则可以是多个而且不限於int型,功能比return 强多了Top

看了 Truly(NULL) 的回答,又让我学了一点^_^Top

返回值都是经常用到,可是也没有用到不是整型的返回值.
今天才知道存储过程只能返回整形的参数吗?   

about the difference @@IDENTITY and SCOPE_IDENTITY
SCOPE_IDENTITY 和 @@IDENTITY 返回在当前会话中的任何表内所生成的最后一个标识值。但是,SCOPE_IDENTITY 只返回插入到当前作用域中的值;@@IDENTITY 不受限于特定的作用域。

例如,有两个表 T1 和 T2,在 T1 上定义了一个 INSERT 触发器。当将某行插入 T1 时,触发器被激发,并在 T2 中插入一行。此例说明了两个作用域:一个是在 T1 上的插入,另一个是作为触发器的结果在 T2 上的插入。

假设 T1 和 T2 都有 IDENTITY 列,@@IDENTITY 和 SCOPE_IDENTITY 将在 T1 上的 INSERT 语句的最后返回不同的值。

@@IDENTITY 返回插入到当前会话中任何作用域内的最后一个 IDENTITY 列值,该值是插入 T2 中的值。

SCOPE_IDENTITY() 返回插入 T1 中的 IDENTITY 值,该值是发生在相同作用域中的最后一个 INSERT。如果在作用域中发生插入语句到标识列之前唤醒调用 SCOPE_IDENTITY() 函数,则该函数将返回 NULL 值。

有关说明,请参见示例。

示例
下列示例将创建两个表 TZ 和 TY,并在 TZ 上创建一个 INSERT 触发器。当将某行插入表 TZ 中时,触发器 (Ztrig) 将激发并在 TY 中插入一行。

USE tempdb
GO
CREATE TABLE TZ (
Z_id int IDENTITY(1,1)PRIMARY KEY,
Z_name varchar(20) NOT NULL)

INSERT TZ
VALUES ('Lisa')
INSERT TZ
VALUES ('Mike')
INSERT TZ
VALUES ('Carla')

SELECT * FROM TZ

--Result set: This is how table TZ looks
Z_id Z_name
-------------
1 Lisa
2 Mike
3 Carla

CREATE TABLE TY (
Y_id int IDENTITY(100,5)PRIMARY KEY,
Y_name varchar(20) NULL)

INSERT TY (Y_name)
VALUES ('boathouse')
INSERT TY (Y_name)
VALUES ('rocks')
INSERT TY (Y_name)
VALUES ('elevator')

SELECT * FROM TY
--Result set: This is how TY looks:
Y_id Y_name
---------------
100 boathouse
105 rocks
110 elevator


CREATE TRIGGER Ztrig
ON TZ
FOR INSERT AS
BEGIN
INSERT TY VALUES ('')
END


INSERT TZ VALUES ('Rosalie')

SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]
GO
SELECT @@IDENTITY AS [@@IDENTITY]
GO

--Here is the result set.
SCOPE_IDENTITY
4


@@IDENTITY
115


Top

Truly(NULL) ( )已经说得很详细了Top

Truly 说的很详细了

补充:.net里接受输出参数和返回值是定义parameter的Direction是有区别的,所以你如果在.net没有定义接受返回值,那不可能获取返回值的.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值