Comment puis-je réensemencer une colonne d'identité dans une variable de table T-SQL?
j'ai un T-SQL tableau de variable (pas une table) qui a une colonne d'identité incrémente automatique. Je veux effacer toutes les données de cette variable et réinitialiser la valeur de la colonne identity à 1. Comment cela peut-il être fait?
6 réponses
Si vous utilisez une variable de table, vous ne pouvez pas le faire. Si c'était un tableau, vous pouvez tronquer ou de l'utilisation DBCC CHECKIDENT
. Mais, si vous pour utiliser une variable de table, vous devez utiliser autre chose qu'une colonne d'identité. Ou, plus précisément, utilisez la colonne identité dans votre variable de tableau mais sortie en 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 le meilleur que vous pouvez faire avec la variable table.
tronquer la table videra toutes les données, et réinitialisera la graine d'identité.
Sinon, vous pouvez utiliser cet appel à rétablir l'identité tout en conservant des données:
DBCC CHECKIDENT (yourtableName, reseed, @NewStartSeedValue)
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
j'ai fait cela quand je voulais utiliser un TOP et une variable en utilisant SQL 2000. En gros, on ajoute les enregistrements et on regarde le minimum. J'ai eu le même problème et a remarqué ce fil. Supprimer la table ne réinitialise pas la graine bien que j'imagine que L'utilisation de GO devrait faire tomber la table et la variable pour réinitialiser la graine.
@maxlimit dans la requête ci-dessus était d'obtenir le top 900 de la requête et puisque la variable de table aurait une clé d'identité de départ différente, ceci permettrait de résoudre ce problème.
toute requête ultérieure peut soustraire cette procédure dérivée pour la faire insérer comme "1", etc.
j'Espère que ça aide.
Lauren
je vous suggère d'utiliser deux variables de table. La @Table1 a une graine d'identité sur la première colonne. @Table2 a la même première colonne mais pas de graines d'identité dessus.
en boucle par le biais de votre processus,
Insert into @Table2 from @Table1
puis Supprimer des deux Tables comme vos boucles de processus.
sur votre première passe, le @Table2 aura un numéro séquentiel dans la première rangée à partir de 1.
la deuxième fois dans la boucle votre deuxième table pourrait avoir numéros séquentiels dans la première colonne commençant par 1081. Mais si vous sélectionnez la valeur minimale à une variable
(Select @FixSeed = min(RowID) From @Table2)
alors vous pouvez mettre à jour @Table2 pour faire démarrer RowID à 1 comme suit:
Update @Table2 Set RowID = RowID - @FixSeed +1
Espérons que cette aide
Si vous avez supprimé toutes les lignes dans une table, et vous souhaitez réinitialiser la valeur de colonne d'identité.
utilisez la commande DBCC CHECKIDENT.
DBCC CHECKIDENT(tblPerson, RESEED, 0)
cette commande réinitialisera la colonne PersonId identity.
une autre chose à noter est que vous pouvez avoir besoin de mettre le nom de la table entre guillemets simples ou entre crochets si vous faites référence par un chemin complet, ou si votre nom de table a des espaces dedans.
DBCC CHECKIDENT ( ‘databasename.dbo.orders’,RESEED, 0)
si vous devez tronquer la variable table à chaque tour d'une boucle while, vous pouvez mettre le declare @myTbl (...)
instruction dans la boucle. Cela va recréer la table et réinitialiser la colonne d'identité à chaque tour de la boucle. Cependant,il a un grand succès de performance. J'ai eu assez serré boucle, et redeclaring la table variable relative delete @myTbl
était plusieurs fois plus lent.
- Dan