存储过程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 the trigger that inserts a row in table TY
when a row is inserted in table TZ*/
CREATE TRIGGER Ztrig
ON TZ
FOR INSERT AS
BEGIN
INSERT TY VALUES ('')
END
/*FIRE the trigger and find out what identity values you get
with the @@IDENTITY and SCOPE_IDENTITY functions*/
INSERT TZ VALUES ('Rosalie')
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]
GO
SELECT @@IDENTITY AS [@@IDENTITY]
GO
--Here is the result set.
SCOPE_IDENTITY
4
/*SCOPE_IDENTITY returned the last identity value in the same scope, which was the insert on table TZ*/
@@IDENTITY
115
/*@@IDENTITY returned the last identity value inserted to TY by the trigger, which fired due to an earlier insert on TZ*/
Top
Truly(NULL) ( )已经说得很详细了Top
Truly 说的很详细了