2017-07-19 3 views
1

Je travaille actuellement sur un type de mappage de données. Disons que je les trois tableaux suivants:Lors de l'insertion, les colonnes de sortie qui n'ont pas été insérées mais dans les tables jointes

TemporaryTable

 
RUNID | DocId | Amount 
E  7  50 
C  6  12 

Table1

 
T1ID | DocID | Amount 
1  5  10 
2  6  20 
3  6  50 

Table2

 
T2ID | RUNID | T1Id 
1  B  1 
2  C  2 
3  D  3 

Dans le tableau Table1 et Table2 les colonnes T1ID et T2ID sont des colonnes d'identité qui sont remplies automatiquement. Ce que je veux faire maintenant est d'insérer les valeurs de TemporaryTable dans Table1 et enregistrer la valeur dans la colonne RunID de TemporaryTable et le nouveau produit T1ID-Table2

Le tableau résultant devrait ressembler à ceci:

Tableau 1

 
T1ID | DocID | Amount 
1  5  10 
2  6  20 
3  6  50 
4  7  50 
5  6  12 

Tableau2

 
T2ID | RUNID | T1Id 
1  B  1 
2  C  2 
3  D  3 
4  E  4 
5  C  5 

Je voudrais le faire avec l'aide de l'instruction output. Quelque chose comme ceci:

CREATE TABLE #map(T1ID, RUNID) 
INSERT INTO Table1(DocId, Amount) 
OUTPUT inserted.T1ID, t.RunId INTO #map 
SELECT t.DocId, t.Amount 
FROM TemporaryTable t 

Cela évidemment ne fonctionne pas puisque je n'ai pas accès à t.RunId dans l'instruction de sortie. Comment cela pourrait-il être fait?

+0

Je ne sais pas si cela doit être fermé en double, mais voici deux très liés questions (avec réponses): https://stackoverflow.com/questions/41184310/insert-into-merge-select-sql-server/41184461#41184461 Et le second: https://stackoverflow.com/questions/ 38213008/t-sql-insert-data-en-parent-et-child-tables –

Répondre

4

Vous pouvez utiliser la commande MERGE avec une condition toujours-faux pour simuler votre insert avec toutes les colonnes disponibles dans OUTPUT

MERGE Table1 t1 
USING TemporaryTable t 
    ON 1=2 
WHEN NOT MATCHED THEN 
    INSERT (DocId, Amount) 
    VALUES (t.DocId, t.Amount) 
    OUTPUT inserted.T1ID, t.RunId 
    INTO #map ; 
+0

Merci pour votre aide! Enfin un vrai avantage de MERGE! –