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.)
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
.