sql INSERT之后获取主键值【转】

SQL   SERVER   2000   中的标识值获取函数    
  IDENTITY(标识)列,也有很多人称之为自增列,在SQL   Server   2000中,标识列通过IDENTITY来定义,下面是与获取最后插入记录的标识值有  
   
  关的函数的一个示例说明    
   
          SQL   Server   中,可以使用   SCOPE_IDENTITY()、   @@IDENTITY   、   IDENT_CURRENT()   来取得最后插入记录的值值,它们的区别在于:  
  SCOPE_IDENTITY()   返回插入到同一作用域中的   IDENTITY   列内的最后一个   IDENTITY   值。一个作用域就是一个模块——存储过程、触发器、函  
   
  数或批处理。因此,如果两个语句处于同一个存储过程、函数或批处理中,则它们位于相同的作用域中。  
  @@IDENTITY               返回在当前会话的所有表中生成的最后一个标识值  
  IDENT_CURRENT()     返回为任何会话和任何作用域中的指定表最后生成的标识值  
  下面以一个示例来说明它们的区别    
   
  --   a)   示例代码    
  --   ===========================================  
  --   创建测试表  
  --   ===========================================  
  USE   tempdb  
  GO  
   
  CREATE   TABLE   t1(id   int   IDENTITY,col   int)  
  INSERT   t1   SELECT   1  
  UNION   ALL   SELECT   2  
  CREATE   TABLE   t2(id   int   IDENTITY,col   int)  
  GO  
   
  CREATE   TRIGGER   TR_insert_t2   ON   t2  
  FOR   INSERT  
  AS  
          INSERT   t1   SELECT   3  
  GO    
   
  --   ===========================================  
  --   测试三个函数..1  
  --   ===========================================  
  INSERT   t2   VALUES(1)  
  SELECT   [SCOPE_IDENTITY()]=SCOPE_IDENTITY(),  
          [@@IDENTITY]=@@IDENTITY,  
          [IDENT_CURRENT()   For   t1]=IDENT_CURRENT(N't1'),  
          [IDENT_CURRENT()   For   t2]=IDENT_CURRENT(N't2')  
   
  /*--结果  
  SCOPE_IDENTITY()       @@IDENTITY       IDENT_CURRENT()   For   t1           IDENT_CURRENT()   For   t2                                        
  ------------------   ------------   --------------------------   -----------------------  
  1                                     3                         3                                                     1  
   
  (所影响的行数为   1   行)  
  --*/  
  GO  
   
  --   ===========================================  
  --   测试三个函数..2  
  --   ===========================================  
  INSERT   t1   VALUES(10)  
  SELECT   [SCOPE_IDENTITY()]=SCOPE_IDENTITY(),  
          [@@IDENTITY]=@@IDENTITY,  
          [IDENT_CURRENT()   For   t1]=IDENT_CURRENT(N't1'),  
          [IDENT_CURRENT()   For   t2]=IDENT_CURRENT(N't2')  
   
  /*--结果  
  SCOPE_IDENTITY()       @@IDENTITY       IDENT_CURRENT()   For   t1           IDENT_CURRENT()   For   t2                                        
  ------------------   ------------   --------------------------   -----------------------  
  4                                     4                         4                                                     1  
   
  (所影响的行数为   1   行)  
  --*/  
  GO  
   
  --   ===========================================  
  --   测试三个函数..3  
  --   **   开启一个新连接,执行下面的代码   **  
  --   ===========================================  
  SELECT   [SCOPE_IDENTITY()]=SCOPE_IDENTITY(),  
          [@@IDENTITY]=@@IDENTITY,  
          [IDENT_CURRENT()   For   t1]=IDENT_CURRENT(N't1'),  
          [IDENT_CURRENT()   For   t2]=IDENT_CURRENT(N't2')  
   
  /*--结果  
  SCOPE_IDENTITY()       @@IDENTITY       IDENT_CURRENT()   For   t1           IDENT_CURRENT()   For   t2                                        
  ------------------   ------------   --------------------------   -----------------------  
  NULL                               NULL                   4                                                   &n    
   
  --===========================================  
  --   删除测试环境  
  --   ===========================================  
  DROP   TABLE   t1,t2    
   
  --   b)   代码结果说明    
  从上面的代码可以看到:  
  IDENT_CURRENT()     始终返回指定表最后插入的标识值  
  @@IDENTITY               返回当前会话的标识值,无论是否在同一个作用域,在测试1、2中,可以看到它返回的是触发器中插入记录的标识值,而在  
   
  测试3中,因为当前会话无插入记录,所以返回NULL  
  SCOPE_IDENTITY()   返回当前会话同一作用域的标识值,所以在测试1、2中,它返回的值不受触发器的影响,而在测试3中,因为当前会话无插  
   
  入记录,所以返回NULL

原文地址:https://www.cnblogs.com/myssh/p/1451964.html