代码之家  ›  专栏  ›  技术社区  ›  Nimesh Madhavan

如何重新设置T-SQL表变量中的标识列?

  •  32
  • Nimesh Madhavan  · 技术社区  · 16 年前

    我有一个T-SQL 表变量 (不是表)具有自动递增标识列。我要清除此变量中的所有数据,并将标识列值重置为1。怎么能做到?

    5 回复  |  直到 6 年前
        1
  •  34
  •   Josef    16 年前

    如果使用的是表变量,则无法执行此操作。如果它是一个表,您可以截断它或使用 DBCC CHECKIDENT . 但是,如果你 要使用表变量,必须使用标识列以外的其他内容。或者,更准确地说,使用表变量中的标识列,但输出使用 ROWNUMBER :

    DECLARE @t table (pkint int IDENTITY(1,1), somevalue nvarchar(50))
    INSERT INTO @t (somevalue) VALUES( 'one')
    INSERT INTO @t (somevalue) VALUES('twp')
    INSERT INTO @t (somevalue) VALUES('three')
    SELECT row_number() OVER (ORDER BY pkint), somevalue FROM @t
    DELETE FROM @t
    INSERT INTO @t (somevalue) VALUES('four')
    SELECT row_number() OVER (ORDER BY pkint), somevalue FROM @t
    

    使用表变量是最好的方法。

        2
  •  33
  •   Bridge user2173966    10 年前

    截断表将转储所有数据,并重置标识种子。

    否则,您可以使用此调用重置标识,同时保留任何数据:

    DBCC CHECKIDENT (yourtableName, reseed, @NewStartSeedValue)
    
        3
  •  0
  •   TResponse    10 年前

    我建议您使用两个表变量。@table1在第一列上有一个标识种子。@表2的第一列相同,但没有标识种子。

    当你循环你的过程时,

    Insert into @Table2 from @Table1
    

    然后从这两个表中删除作为流程循环。

    第一次通过时,@table2将在第一行中有一个从1开始的序列号。

    第二次通过循环,您的第二个表可能在第一列中有序列号,从1081开始。但是如果你选择一个变量的最小值

    (Select @FixSeed = min(RowID) From @Table2)
    

    然后可以更新@table2,使rowid从1开始,如下所示:

    Update @Table2  Set  RowID = RowID - @FixSeed +1
    

    希望这有帮助

        4
  •  0
  •   johnnyRose    6 年前
        declare @tb table (recid int,lineof int identity(1,1))
    
        insert into @tb(recid)
        select recid from tabledata 
    
        delete from @tb where lineof>(select min(lineof) from @tb)+@maxlimit
    

    当我想在使用SQL 2000时使用top和变量时,我就这样做了。基本上,添加记录,然后查看最小值。我也有同样的问题,注意到了这条线。删除表不会重置种子,尽管我认为使用go应该删除表和变量来重置种子。

    @上面查询中的maxlimit是获取查询的前900个,由于表变量将具有不同的起始标识键,因此这可以解决该问题。

    任何后续查询都可以减去该派生过程,使其插入为“1”等。

        5
  •  -3
  •   user1017467    13 年前

    如果需要在while循环的每个循环中截断表变量,可以将 declare @myTbl (...) 循环中的语句。这将重新创建表,并在每次循环时重置标识列。然而,它有一个沉重的性能打击。我有一个相当紧密的循环,重新定义表变量相对于 delete @myTbl 慢了几倍。