37

我有一个 T-SQL表变量(不是表),它有一个自动递增的标识列。我想清除该变量中的所有数据并将标识列值重置为 1。如何做到这一点?

4

5 回答 5

38

如果您使用的是表变量,则不能这样做。如果它是一个表,你可以截断它或使用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

这是你可以用 table 变量做的最好的事情。

于 2008-09-29T02:57:12.820 回答
29

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

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

DBCC CHECKIDENT (yourtableName, reseed, @NewStartSeedValue)
于 2008-09-29T01:37:46.023 回答
1

我建议你使用两个表变量。@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

希望这可以帮助

于 2015-01-26T04:58:12.267 回答
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”等。

于 2014-07-07T17:02:22.973 回答
-3

如果您需要在while循环的每一轮中截断表变量,您可以将declare @myTbl (...)语句放入循环中。这将在循环的每一轮重新创建表并重置标识列。但是,它对性能造成了严重影响。我有一个相当紧凑的循环,并且相对于重新声明表变量要delete @myTbl慢几倍。

于 2011-10-27T23:12:52.523 回答