Question

J'ai une variable de table T-SQL (et non une table) dotée d'une colonne d'identité à incrémentation automatique. Je souhaite effacer toutes les données de cette variable et redéfinir la valeur de la colonne d'identité à 1. Comment cela peut-il être fait?

Était-ce utile?

La solution

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 . Toutefois, si vous devez 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 utilisez le code 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.

Autres conseils

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 les données:

DBCC CHECKIDENT (yourtableName, reseed, @NewStartSeedValue)

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

Lorsque vous parcourez votre processus,

Insert into @Table2 from @Table1

puis supprimez 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 en commençant à 1.

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

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

Vous pouvez ensuite mettre à jour @ Table2 pour que RowID commence à 1 comme suit:

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

J'espère que cela vous aidera

    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 regardez 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 valeur initiale, mais j’imagine que l’utilisation de GO devrait supprimer la table et la variable permettant de la réinitialiser.

@maxlimit dans la requête ci-dessus visait à obtenir le top 900 de la requête et puisque la variable de table aurait une clé d’identité de départ différente, cela résoudrait ce problème.

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

Si vous devez tronquer la variable de table à chaque tour d'une boucle while, vous pouvez placer l'instruction declare @myTbl (...) dans la boucle. Cela recréera la table et réinitialisera la colonne identité à chaque tour de la boucle. Cependant, il a un lourd impact sur les performances. J'avais une boucle assez serrée, et redéclarer la variable de table relative à delete @myTbl a été plusieurs fois plus lent.

  • Dan
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top