dotnet 获得存储过程返回值和输出参数有什么不同 @@IDENTITY SCOPE_IDENTITY();

本文探讨了SQL存储过程中输出参数的应用场景与区别,包括如何使用输出参数返回多个值及其实现方式,对比RETURN与输出参数的功能差异,并解析了@@IDENTITY与SCOPE_IDENTITY在并发环境下的行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

存储过程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   说的很详细了  
   
  补充:.net里接受输出参数和返回值是定义parameter的Direction是有区别的,所以你如果在.net没有定义接受返回值,那不可能获取返回值的.

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值