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

来源:互联网 发布:网络摄像机监控方案 编辑:程序博客网 时间:2024/05/06 14:26

存储过程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没有定义接受返回值,那不可能获取返回值的.