我有具有自动递增标识列的T-SQL 表变量 (未表)。 我想从这个变量清除所有数据并重置标识列值设为1。如何才能做到这一点?
Answer 1:
如果您使用的是表变量,你不能做到这一点。 如果它是一个表,你可以截断或使用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
这是你可以用表变量做到最好。
Answer 2:
截断该表将转储所有数据,并重新设置标识种子。
否则,你可以使用这个调用来重置身份,同时保留任何数据:
DBCC CHECKIDENT (yourtableName, reseed, @NewStartSeedValue)
Answer 3:
我建议你用两个表变量。 在表1 @具有在第一列上的身份的种子。 @表2具有相同的第一列,但它没有身份证的种子。
当你遍历的过程中,
Insert into @Table2 from @Table1
然后从两个表中删除作为处理循环。
在您第一次通过时,@表2将在第一行AA序列号从1开始。
通过循环的第二次你的第二个表可能有在第一列的起始序列号为1081的发言权,但如果你选择的最小值为变量
(Select @FixSeed = min(RowID) From @Table2)
然后,你可以更新@表2,使在1如下ROWID开始:
Update @Table2 Set RowID = RowID - @FixSeed +1
希望这可以帮助
Answer 4:
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”,等等。
Answer 5:
如果您需要截断表变量在while循环的每一轮,你可以把declare @myTbl (...)
声明循环。 这将重新创建表,并在循环的每个回合重置标识列。 但是,它有一个沉重的性能损失。 我有相当紧密的循环,并表变量相对于重新声明delete @myTbl
是几次慢。
- 和
文章来源: How can I reseed an identity column in a T-SQL table variable?