none
在SQL SERVER中,ID是 自增字段,如何返回新记录的ID值? RRS feed

答案

  • insert into table1 values(colvalue1,colvalue2)
    select scope_identity()

    @@identity 还是可能有问题。

    以下内容参考MSDN:

    SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY 是相似的函数,因为它们都返回插入到标识列中的值。

    IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的表。IDENT_CURRENT 返回为任何会话和作用域中的特定表所生成的值。有关详细信息,请参阅 IDENT_CURRENT (Transact-SQL)。

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


    family as water
    2010年5月12日 9:46
  • -----------------------------------------------3种返回最大标识值的方法的不同点--------------------------------------- 
    
    --测试数据表
    
    create table test1 (id int identity(1,1),value int)
    
    create table test2 (id int identity(1,1),value int)
    
    create table test3 (id int identity(1,1),value int)
    
    go
    
    --建立触发器
    
    create trigger tr_t1 on test1 
    
    after insert 
    
    as
    
    begin 
    
    insert test2 values(1)
    
    end
    
     
    
    --1、@@IDENTITY 返回为当前会话的所有作用域中的任何表最后生成的标识值。 
    
     insert test2 values(3)
    
     select @@IDENTITY 
    
     /*1*/
    
     go
    
     insert test1 values(1)
    
     select @@IDENTITY 
    
     /*2*/ 
    
     ----居然不是这是为什么呢?-----
    
     --因为它触发了test1上面的触发器这个时候它执行了向test2中插入一条记录,而test2上就有第二条记录,标识列就为了------------
    
     truncate table test1
    
     truncate table test2
    
    --2、SCOPE_IDENTITY 返回为当前会话和当前作用域中的任何表最后生成的标识值。(防止返回触发器中的insert的IDENTITY值) 
    
       --------为了防止刚才的触发器引发的“错误”,我们利用SCOPE_IDENTITY函数---------
    
       insert test2 values(3)
    
     select SCOPE_IDENTITY() 
    
     /*1*/
    
     go
    
     insert test1 values(1)
    
     select SCOPE_IDENTITY() 
    
     /*1*/
    
     truncate table test1
    
     truncate table test2
    
    --3、IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值。
    
    -----想任意的返回你想要的表的标识值,那么我们使用IDENT_CURRENT--------------
    
     insert test2 values(3)
    
     select IDENT_CURRENT('test2') 
    
     /*1*/
    
     go
    
     insert test1 values(1)
    
     select IDENT_CURRENT('test2') 
    
     /*2*/
    
     select IDENT_CURRENT('test1') 
    
     /*1*/ 
    
    
    
    2010年5月13日 8:53

全部回复


  • insert into table1 values(colvalue1,colvalue2)
    select @@identity

    努力+方法=成功
    2010年5月11日 9:09
  • 1)先插入再查询,每插入一条查询一次,效率低下;

    2)在SQL server中,可以自己设置增幅(默认为1)。这样在插入前SELECT MAX(ID),然后你就可以知道每插入一条是增1(Insert成功的话)。

    2010年5月11日 9:21
  • @@identity函数返回最后插入的标识值
    2010年5月11日 9:36
  • @@identity函数返回最后插入的标识值

    @@IDENTITY 是 SQL Server 对象而不是函数。大家不要混淆。
    Mark Zhou
    2010年5月11日 10:12
  • 1)先插入再查询,每插入一条查询一次,效率低下;

    2)在SQL server中,可以自己设置增幅(默认为1)。这样在插入前SELECT MAX(ID),然后你就可以知道每插入一条是增1(Insert成功的话)。


    你的方法肯定不对的。你可以持续关注此贴。
    2010年5月12日 9:11
  • 写在存储过程中返回最后插入记录的ID号;思路就是,先插入该记录,然后再获取该记录的ID号,通过输出参数返回该值。

    2010年5月12日 9:25
  • 这个实现的方法很多。
    2010年5月12日 9:26
  • insert into table1 values(colvalue1,colvalue2)
    select scope_identity()

    @@identity 还是可能有问题。

    以下内容参考MSDN:

    SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY 是相似的函数,因为它们都返回插入到标识列中的值。

    IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的表。IDENT_CURRENT 返回为任何会话和作用域中的特定表所生成的值。有关详细信息,请参阅 IDENT_CURRENT (Transact-SQL)。

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


    family as water
    2010年5月12日 9:46
  • insert into table1 values(colvalue1,colvalue2)
    select scope_identity()

    @@identity 还是可能有问题。

    以下内容参考MSDN:

    SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY 是相似的函数,因为它们都返回插入到标识列中的值。

    IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的表。IDENT_CURRENT 返回为任何会话和作用域中的特定表所生成的值。有关详细信息,请参阅 IDENT_CURRENT (Transact-SQL)。

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


    family as water
    你好,还是不太理解以上的问题,请仔细解释一下 哦。谢谢。
    2010年5月12日 11:24
  • 如果是oracle的自增序列,那又如何获取呢?
    2010年5月13日 0:49
  • 在ORACLE中你可以两种办法

    1.  select max(id) from sys_ukeyinfo;

    2.      Oracle中没有identity, 只有序列,即sequence,

           CREATE SEQUENCE sq_userInboxId
            MINVALUE 1
         MAXVALUE 10000000
         START WITH 1
           INCREMENT BY 1
         NOCACHE

        select sq_userInboxId .nextval from dual;
      查出后将结果放入变量a,
       然后
       INSERT INTO T_CUST(sq_userInboxId, CUST_NAME) VALUES(a, 'hahaha');


    努力+方法=成功
    2010年5月13日 1:24
  • insert into table1 values(colvalue1,colvalue2)
    select scope_identity()

    @@identity 还是可能有问题。

    以下内容参考MSDN:

    SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY 是相似的函数,因为它们都返回插入到标识列中的值。

    IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的表。IDENT_CURRENT 返回为任何会话和作用域中的特定表所生成的值。有关详细信息,请参阅 IDENT_CURRENT (Transact-SQL)。

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


    family as water
    你好,还是不太理解以上的问题,请仔细解释一下 哦。谢谢。


    你可以查看SQL server的帮助文档,在里面搜索 SCOPE_IDENTITY() ,可以查到你要的,请仔细阅读。

     


    family as water
    2010年5月13日 1:55
  • -----------------------------------------------3种返回最大标识值的方法的不同点--------------------------------------- 
    
    --测试数据表
    
    create table test1 (id int identity(1,1),value int)
    
    create table test2 (id int identity(1,1),value int)
    
    create table test3 (id int identity(1,1),value int)
    
    go
    
    --建立触发器
    
    create trigger tr_t1 on test1 
    
    after insert 
    
    as
    
    begin 
    
    insert test2 values(1)
    
    end
    
     
    
    --1、@@IDENTITY 返回为当前会话的所有作用域中的任何表最后生成的标识值。 
    
     insert test2 values(3)
    
     select @@IDENTITY 
    
     /*1*/
    
     go
    
     insert test1 values(1)
    
     select @@IDENTITY 
    
     /*2*/ 
    
     ----居然不是这是为什么呢?-----
    
     --因为它触发了test1上面的触发器这个时候它执行了向test2中插入一条记录,而test2上就有第二条记录,标识列就为了------------
    
     truncate table test1
    
     truncate table test2
    
    --2、SCOPE_IDENTITY 返回为当前会话和当前作用域中的任何表最后生成的标识值。(防止返回触发器中的insert的IDENTITY值) 
    
       --------为了防止刚才的触发器引发的“错误”,我们利用SCOPE_IDENTITY函数---------
    
       insert test2 values(3)
    
     select SCOPE_IDENTITY() 
    
     /*1*/
    
     go
    
     insert test1 values(1)
    
     select SCOPE_IDENTITY() 
    
     /*1*/
    
     truncate table test1
    
     truncate table test2
    
    --3、IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值。
    
    -----想任意的返回你想要的表的标识值,那么我们使用IDENT_CURRENT--------------
    
     insert test2 values(3)
    
     select IDENT_CURRENT('test2') 
    
     /*1*/
    
     go
    
     insert test1 values(1)
    
     select IDENT_CURRENT('test2') 
    
     /*2*/
    
     select IDENT_CURRENT('test1') 
    
     /*1*/ 
    
    
    
    2010年5月13日 8:53