2010-11-21 3 views
1

Y at-il un moyen de stocker les valeurs d'identité juste avant une insertion et les nouvelles valeurs d'identité juste après une insertion dans une table de mappage? La table de mappage sera utilisée pour mettre à jour les clés étrangères dans d'autres tables.Identité du magasin avant et après un insert?

Initialement, je pensais que c'était possible avec la clause OUTPUT INTO, mais seules les valeurs insérées sont insérables. Je ne sais pas comment utiliser la clause OUTPUT pour faire le travail. Peut-être une sorte de sous-requête?

Peut-être que c'est trop compliqué et qu'il existe un moyen d'utiliser SCOPE_IDENTITY et des sous-requêtes pour cela.

Toute aide serait grandement appréciée.

p.s. Oui, je sais que je peux résoudre cela en "réservant" des identités (insérer des lignes factices puis supprimer ou DBCC CHECKINDENT), enregistrer les identités nouvellement "réservées" et les anciennes identités dans la table de mappage, mettre à jour la table avec les nouvelles identités et enfin faire un insert avec INSERT_IDENTITIES activé - mais c'est désordonné. Ceci s'applique à SQL Server 2008 R2.

Voici ce qui ne fonctionne pas:

INSERT 
    [SomeTable] 
    OUTPUT 
      INSERTED.[Id], 
      [Id] -- This doesn't work 
     INTO 
      [#mappingTable] 
SELECT 
    (SomeColumns) 
FROM 
    [#someOtherTable]; 

Répondre

0

Il peut être fait avec un statment MERGE et une clause de SORTIE. Dommage que personne n'ait répondu avec cette info, mon collègue m'a montré.

0

Vous ne pouvez pas savoir à l'avance ce que les identités seront.

Et la clause OUTPUT ne fonctionne que sur la table que vous avez insérée, pas les tables source. Je l'ai souhaité aussi: cela serait utile.

Donc, vous ne pouvez ré-interroger la table inserted (comme ci-dessous) ou METTRE À JOUR #mappingTable

INSERT 
    [SomeTable] 
SELECT 
    (SomeColumns) 
FROM 
    [#someOtherTable]; 

SELECT 
    ID, stuff 
FROM 
    SomeTable 
+1

Bummer, cela ne peut pas être fait avec un UPDATE sur la table de mappage avec un CTE qui fait l'insertion et a une clause OUTPUT retournant la nouvelle identité? – user514848

Questions connexes