Ich schreibe eine Batch-Verarbeitungs-Insert-Anweisung und möchte eine temporäre Tabelle verwenden, um die eingefügten IDs zu verfolgen, anstatt die Elemente selbst zu durchlaufen und SCOPE_IDENTITY () für jede eingefügte Zeile aufzurufen.
Die Daten, die eingefügt werden müssen, haben (temporäre) IDs, die sie mit anderen Daten verknüpfen, die ebenfalls in eine andere Tabelle eingefügt werden sollen. Daher benötige ich einen Querverweis auf die tatsächliche ID und die temporäre ID.
Dies ist ein Beispiel für das, was ich bisher habe:
-- The existing table
DECLARE @MyTable TABLE (ID INT IDENTITY(1,1), [Name] NVARCHAR(MAX));
-- My data I want to insert
DECLARE @MyInsertData TABLE (ID INT, [Name] NVARCHAR(MAX));
INSERT INTO @MyInsertData ( ID,Name)
VALUES ( -1 , 'bla'),(-2,'test'),(-3,'last');
DECLARE @MyCrossRef TABLE ([NewId] INT, OldId INT);
INSERT INTO @MyTable ( [Name] )
OUTPUT Inserted.ID, INS.ID INTO @MyCrossRef
SELECT [NAME] FROM @MyInsertData INS
-- Check the result
SELECT * FROM @MyCrossRef
Das Problem ist, dass ich die OUTPUT INTO-Klausel nicht dazu bringen kann, die ID zu akzeptieren. Ich habe es versucht @MyInsertData.ID
und andere Tricks, die die Tabelle mit sich selbst verbinden, aber nichts scheint zu funktionieren.
quelle
Die Ausgabeklausel kann nur auf Daten in den Zielzeilen und Konstanten / Variablen zugreifen, nicht auf Daten von anderen Stellen in der Quelle
SELECT
, wie wenn Sie in einem Trigger arbeiten.https://docs.microsoft.com/en-us/sql/t-sql/queries/output-clause-transact-sql besagt:
Um die ursprüngliche ID zu erhalten, müssten Sie sie in die Zieltabelle aufnehmen, damit die Ausgabeklausel sie wie folgt wiedergeben kann:
Das Ändern des Schemas des Zielobjekts ist in Ihrer Situation möglicherweise nicht praktikabel, sodass dies möglicherweise nicht anwendbar ist.
quelle