2008-09-29 67 views

回答

33

如果您使用的是表變量,你不能做到這一點。如果它是一張桌子,你可以截斷它或使用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 

這是你可以用表變量做到最好。

35

截斷表將轉儲所有數據,並重置身份種子。

否則,你可以使用這個調用重置身份,同時保留任何數據:

DBCC CHECKIDENT (yourtableName, reseed, @NewStartSeedValue) 
+1

很酷,我從來不知道那個DBCC命令。謝謝! – 2008-09-29 02:13:48

+15

不能對錶變量進行TRUNCATE,也不能在表變量上使用DBCC CHECKIDENT。 – AndrewJacksonZA 2011-12-02 07:11:18

-3

如果您需要在while循環的每個回合中截斷表變量,則可以將declare @myTbl (...)語句放入循環中。這將重新創建表並在循環的每一回閤中重置標識列。然而,它有一個沉重的表現。我有一個相當緊的循環,並且相對於delete @myTbl重新聲明表變量要慢幾倍。

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)[email protected] 

我這樣做時,我想使用SQL 2000的時候基本上,你在添加記錄,然後看看最小的一個使用TOP和變量。我有同樣的問題,並注意到這個線程。刪除表不會重置種子,儘管我想象使用GO應該刪除表和變量來重置種子。

@maxlimit在上面的查詢中是爲了獲得查詢的前900個,並且由於表變量將具有不同的起始身份密鑰,所以這將解決該問題。

任何後續查詢可以減去衍生過程,使其插入爲「1」,等等。

希望它能幫助。

Lauren

0

我建議你使用兩個表變量。 @ Table1在第一列上有一個標識種子。 @表2具有相同的第一列,但沒有身份種子。

當你遍歷的過程中,

Insert into @Table2 from @Table1 

然後刪除兩個表中爲你處理循環。

在你第一遍時,@表2將在第一行AA序列號從1開始。

通過循環的第二次你的第二個表可能有在第一列序列號開始說1081 。但是,如果你選擇的最小值爲變量

(Select @FixSeed = min(RowID) From @Table2) 

然後你就可以更新@表2,使行ID從1開始,如下:

Update @Table2 Set RowID = RowID - @FixSeed +1 

希望這有助於

0

如果您已刪除表中的所有行,並且您想要重置標識列值。

使用DBCC CHECKIDENT命令。

DBCC CHECKIDENT(tblPerson, RESEED, 0) 

此命令將重置PersonId標識列。

需要注意的另一件事是,如果您使用完整路徑引用或者您的表名中包含空格,則可能需要將表名稱用單引號或方括號括起來。

DBCC CHECKIDENT (‘databasename.dbo.orders’,RESEED, 0)