2008-09-29 7 views

Antwort

33

Wenn Sie eine Tabelle Variable verwenden, können Sie es nicht tun können. Wenn es eine Tabelle wäre, könnten Sie sie abschneiden oder DBCC CHECKIDENT verwenden. Wenn Sie jedoch verwenden, um eine Tabellenvariable zu verwenden, müssen Sie etwas anderes als eine Identitätsspalte verwenden. Oder, genauer gesagt, verwenden Sie die Identitätsspalte in der Tabelle variabel, aber Ausgang mit 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 

Es ist das Beste, was Sie mit der Tabellenvariable zu tun.

35

Durch das Abschneiden der Tabelle werden ALLE Daten gespeichert und der Identitätsstart zurückgesetzt.

Andernfalls können Sie diesen Aufruf benutzen, um die Identität zurückgesetzt, während jede der Datenhalte:

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

Cool, ich wusste nie über diesen DBCC-Befehl. Vielen Dank! –

+15

Man kann eine Tabellenvariable weder TRUNCATE noch DBCC CHECKIDENT für eine Tabellenvariable verwenden. – AndrewJacksonZA

+8

-1 Die Frage bezog sich speziell auf Tabellenvariablen. Wie in dem obigen Kommentar angegeben, kann in dieser Antwort nichts für diese verwendet werden. –

-3

Wenn Sie die Tabellenvariable in jeder Runde einer while-Schleife abschneiden müssen, können Sie die declare @myTbl (...)-Anweisung in die Schleife einfügen. Dadurch wird die Tabelle neu erstellt und die Identitätsspalte wird bei jedem Durchlauf der Schleife zurückgesetzt. Es hat jedoch einen starken Leistungseinbruch. Ich hatte ziemlich enge Schleife, und die Tabelle Variable relativ zu delete @myTbl neu deklarieren war mehrmals langsamer.

  • Dan
+2

Nein. Dies funktioniert nicht. –

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] 

Ich tat dies, wenn ich eine TOP und eine Variable verwenden wollte, als mit SQL 2000. Grundsätzlich Sie in den Datensätzen hinzufügen und dann auf das Minimum aussehen. Ich hatte das gleiche Problem und habe diesen Thread bemerkt. Das Löschen der Tabelle setzt den Seed nicht zurück, obwohl ich mir vorstelle, GO zu verwenden, sollte die Tabelle und die Variable löschen, um den Seed zurückzusetzen.

@maxlimit in der Abfrage oben war, um die Top 900 der Abfrage zu erhalten und da die Tabellenvariable einen anderen Start-Identitätsschlüssel hätte, würde dies das Problem lösen.

kann Jede spätere Abfrage, dass die abgeleiteten Verfahren subtrahieren, um es als „1“ machen einfügen usw.

Hoffe, es hilft.

Lauren

0

Ich schlage vor, Sie verwenden zwei Tabellenvariablen. Das @ Table1 hat einen Identitätsstartwert in der ersten Spalte. @ Table2 hat die gleiche erste Spalte, aber keine Identität.

Wie Sie eine Schleife durch Ihren Prozess,

Insert into @Table2 from @Table1 

dann aus beiden Tabellen löschen als Prozess Loops. bei 1.em

Das zweite Mal durch die Schleife könnte Ihre zweite Tabelle hat fortlaufende Nummern in der ersten Spalte ab etwa 1081

Beim ersten Durchlauf wird die @ Table2 beginnend aa laufende Nummer in der ersten Reihe hat .Aber wenn Sie den minimalen Wert auf eine Variable

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

Dann wählen Sie @ Table2 aktualisieren, um RowID bei 1 zu machen beginnen wie folgt:

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

this helps

0

Wenn Sie gelöscht haben alle Zeilen in einer Tabelle und Sie möchten den Identitätsspaltenwert zurücksetzen.

USe DBCC CHECKIDENT Befehl.

DBCC CHECKIDENT(tblPerson, RESEED, 0) 

Dieser Befehl wird die Identity-Spalte von PersonId zurücksetzen.

Eine andere Sache zu beachten ist, dass Sie den Tabellennamen in einfache Anführungszeichen oder eckige Klammern einschließen müssen, wenn Sie einen vollständigen Pfad referenzieren, oder wenn Ihr Tabellenname Leerzeichen enthält.

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