我有一个 T-SQL表变量(不是表),它有一个自动递增的标识列。我想清除该变量中的所有数据并将标识列值重置为 1。如何做到这一点?
5 回答
如果您使用的是表变量,则不能这样做。如果它是一个表,你可以截断它或使用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 变量做的最好的事情。
截断表将转储所有数据,并重置身份种子。
否则,您可以使用此调用来重置身份,同时保留任何数据:
DBCC CHECKIDENT (yourtableName, reseed, @NewStartSeedValue)
我建议你使用两个表变量。@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
希望这可以帮助
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”等。
如果您需要在while循环的每一轮中截断表变量,您可以将declare @myTbl (...)
语句放入循环中。这将在循环的每一轮重新创建表并重置标识列。但是,它对性能造成了严重影响。我有一个相当紧凑的循环,并且相对于重新声明表变量要delete @myTbl
慢几倍。
- 担