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

时间:2008-09-29 01:34:18

标签: sql-server tsql table-variable

我有一个T-SQL 表变量(不是表),它有一个自动递增的标识列。我想清除此变量中的所有数据并将标识列值重置为1.如何才能完成此操作?

5 个答案:

答案 0 :(得分:34)

如果您正在使用表变量,则无法执行此操作。如果它是一个表,您可以截断它或使用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

使用表变量是最好的。

答案 1 :(得分:33)

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

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

DBCC CHECKIDENT (yourtableName, reseed, @NewStartSeedValue)

答案 2 :(得分:0)

    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”等等。

答案 3 :(得分:0)

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

当您循环完成整个过程时,

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 :(得分:-3)

如果需要在while循环的每个回合中截断表变量,可以将declare @myTbl (...)语句放在循环中。这将重新创建表并在循环的每个回合处重置标识列。然而,它的性能受到了沉重打击。我的循环相当紧凑,并且相对于delete @myTbl重新声明表变量要慢几倍。