我在存储过程中定义了一个临时表变量,其中一列使用了@@identity
declare @temp_table table(f_id identity(1,1))在存储过程中有向其他表插入数据的操作,此表中有一个字增长的主键。
insert into tableA .......执行完成后我发现tableA表中的主键值并不是从1开始增长,而是从某个数开始增长,某个数的值恰巧是插入表变量的行数是不是这个@@identity这个变量在一个存储过程中是共用的,我如何解决这个问题。
谢谢大家

解决方案 »

  1.   

    在一条 INSERT、SELECT INTO 或大容量复制语句完成后,@@IDENTITY 中包含此语句产生的最后的标识值。若此语句没有影响任何有标识列的表,则 @@IDENTITY 返回 NULL。若插入了多个行,则会产生多个标识值,@@IDENTITY 返回最后产生的标识值。如果此语句激发一个或多个执行产生标识值的插入操作的触发器,则语句执行后立即调用 @@IDENTITY 将返回由触发器产生的最后的标识值。若 INSERT 或 SELECT INTO 语句失败或大容量复制失败,或事务被回滚,则 @@IDENTITY 值不会还原为以前的设置。在返回插入到表的 @@IDENTITY 列的最后一个值方面,@@IDENTITY、SCOPE_IDENTITY 和 IDENT_CURRENT 函数类似。 @@IDENTITY 和 SCOPE_IDENTITY 将返回在当前会话的所有表中生成的最后一个标识值。但是,SCOPE_IDENTITY 只在当前作用域内返回值,而 @@IDENTITY 不限于特定的作用域。
      

  2.   

    若插入了多个行,则会产生多个标识值,@@IDENTITY 返回最后产生的标识值。
      

  3.   

    乌龟蝈蝈,那我的这个问题是否使用SCOPE_IDENTITY就能解决?
    我如何向临时表插入值后,把@@identity清零
      

  4.   

    如果是我的话,可能不使用自增量,而使用select isnull(max(id),0) + 1 from tb这样的方法了。
      

  5.   

    --(1)当一个会话启动的时候只能有一个identity_insert #tb on,否则会报错   
    create table #ta    
    (   
      id int identity(1,1),   
      col1 int   
    )   
      
    create table #tb   
    (   
      id int identity(1,1),   
      col1 int   
    )   
      
    set identity_insert #ta off   
    set identity_insert #tb on   
    --(2)当设置identity_insert选项值为 ON的时候,可以插入id.   
    create table #te   
    (   
      id int identity(1,1),   
      col1 varchar(10)   
    )   
    insert into #te values ('aa')   
    insert into #te values ('bb')   
    select * from #te   
    set identity_insert #te on   
    insert into #te(id,col1) values (10,'ff')   
      
    set identity_insert #te off   
    insert into #te values ('hh') 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ws_hgo/archive/2009/02/06/3866850.aspx
      

  6.   

    CRM的做法是用一个存储过程专门来生成id,可以控制到所有的表。因为表的信息也被记录了下来(用另外一个表)。
      

  7.   

    SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY 在功能上相似,因为它们都返回插入到 IDENTITY 列中的值
    IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的表。IDENT_CURRENT 返回为任何会话和作用域中的特定表所生成的值
    SCOPE_IDENTITY 和 @@IDENTITY 返回在当前会话中的任何表内所生成的最后一个标识值。但是,SCOPE_IDENTITY 只返回插入到当前作用域中的值;@@IDENTITY 不受限于特定的作用域。