我有一个T-SQL 表变量(不是表),它有一个自动递增的标识列。我想清除此变量中的所有数据并将标识列值重置为1.如何才能完成此操作?
答案 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
重新声明表变量要慢几倍。