我怎样才能补种在T-SQL表变量标识列?(How can I reseed an identity

2019-07-19 08:19发布

我有具有自动递增标识列的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?