Combine OUTPUT insert.id mit Wert aus ausgewählter Zeile

LaufenSQL Server 2014. Wie kann ich mehrere Zeilen aus einer Tabelle einfügen und die eingefügten Daten mit den neuen IDs kombinieren?

Schauen wir uns ein reduziertes Beispiel an!

DECLARE @Old TABLE 
(
    [ID] [int] PRIMARY KEY,
    [Data] [int] NOT NULL
)

DECLARE @New TABLE
(
    [ID] [int] PRIMARY KEY,
    [OtherID] [int] NULL
)

INSERT INTO [dbo].[Test] ([Data])
OUTPUT inserted.[ID], [@Old].[ID] /* <--- not supported :( */ INTO @New
SELECT [Data]
FROM @Old

Ich muss die eingegebenen IDs mit den Daten kombinieren, die gerade eingefügt werden. Kann ich davon ausgehen, dass die eingefügten Zeilen in derselben Reihenfolge wie die ausgewählten Zeilen sind? (Ich werde nicht in der Lage sein, @ beizutret[Data] nach dem Einfügevorgang.)

Aktualisiere

Das Folgende scheint eine mögliche Lösung zu sein, aber ich kann keinen Beweis dafür finden, dass es funktioniert. Funktioniert es garantiert?

DECLARE @Old TABLE 
(
    [RowID] [int] PRIMARY KEY IDENTITY, -- Guaranteed insert order?     
    [ID] [int] NOT NULL,
    [Data] [int] NOT NULL
)

DECLARE @New TABLE
(
    [RowID] [int] PRIMARY KEY IDENTITY, -- Guaranteed insert order? 
    [ID] [int] NOT NULL,
    [OtherID] [int] NULL
)

INSERT INTO [dbo].[Test] ([Data])
OUTPUT inserted.[ID] INTO @New
SELECT [Data]
FROM @Old
ORDER BY [RowID]

Der Trick hier ist, ein separates @ zu verwendidentity Spalte undORDER BY für die ausgewählten Zeilen und dannjoining on RowID.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage