web-dev-qa-db-fra.com

Comment puis-je réamorcer une colonne d'identité dans une variable de table T-SQL?

J'ai un T-SQL table variable (pas une table) qui a une colonne d'identité auto-incrémentée. Je veux effacer toutes les données de cette variable et redéfinir la valeur de la colonne identité à 1. Comment cela peut-il être effectué?

32
Nimesh Madhavan

Si vous utilisez une variable de table, vous ne pouvez pas le faire. S'il s'agissait d'une table, vous pouvez la tronquer ou utiliser DBCC CHECKIDENT. Mais si vous devez pour utiliser une variable de table, vous devez utiliser autre chose qu'une colonne d'identité. Ou, plus précisément, utilisez la colonne d'identité dans votre variable de table, mais la sortie utilisant 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

C'est ce que vous pouvez faire de mieux avec la variable de table. 

34
Josef

Tronquer la table videra TOUTES les données et réinitialisera le germe d’identité.

Sinon, vous pouvez utiliser cet appel pour réinitialiser l'identité tout en conservant l'une des données:

DBCC CHECKIDENT (yourtableName, reseed, @NewStartSeedValue)
33
Stephen Wrighton
    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

Je l’ai fait lorsque je voulais utiliser un TOP et une variable lors de l’utilisation de SQL 2000. En gros, vous ajoutez des enregistrements, puis vous examinez le minimum. J'ai eu le même problème et j'ai remarqué ce fil. La suppression de la table ne réinitialise pas la graine bien que j'imagine que l'utilisation de GO devrait supprimer la table et la variable permettant de réinitialiser la graine.

@maxlimit dans la requête ci-dessus visait à obtenir le premier 900 de la requête et, comme la variable de table aurait une clé d'identité de départ différente, le problème serait résolu.

Toute requête ultérieure peut soustraire cette procédure dérivée pour l'insérer sous la forme "1", etc.

0
Lauren Glenn

Je vous suggère d'utiliser deux variables de table. @ Table1 a une graine d'identité sur la première colonne. @ Table2 a la même première colonne mais aucune graine d'identité dessus.

En parcourant votre processus, 

Insert into @Table2 from @Table1

puis Supprimer des deux tables en tant que vos boucles de processus.

Lors de votre premier passage, la @ Table2 aura un numéro séquentiel dans la première ligne commençant à 1. 

La deuxième fois dans la boucle, votre deuxième table peut avoir des numéros séquentiels dans la première colonne, commençant par exemple à 1081. Mais si vous sélectionnez la valeur minimale d'une variable 

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

Ensuite, vous pouvez mettre à jour @ Table2 pour que RowID commence à 1 comme suit:

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

J'espère que cela t'aides

0
Pavlo Carerra