Saya menulis pernyataan penyisipan pemrosesan batch dan ingin menggunakan tabel temp untuk melacak ID yang dimasukkan alih-alih mengulang-ulang item sendiri dan memanggil SCOPE_IDENTITY () untuk setiap baris yang dimasukkan.
Data yang perlu dimasukkan memiliki (sementara) ID yang menautkannya ke data lain yang juga harus dimasukkan ke tabel lain, jadi saya perlu referensi silang dari Id aktual dan Id sementara.
Ini adalah contoh dari apa yang saya miliki sejauh ini:
-- 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
Masalahnya adalah bahwa saya tidak bisa mendapatkan klausa OUTPUT INTO untuk menerima ID, saya sudah mencoba @MyInsertData.ID
dan trik lain bergabung dengan tabel untuk dirinya sendiri, tetapi sepertinya tidak ada yang berhasil.
sumber
Klausa output hanya dapat mengakses data di baris target dan konstanta / variabel, bukan data dari tempat lain di sumber
SELECT
, seperti jika Anda beroperasi di pemicu.https://docs.microsoft.com/en-us/sql/t-sql/queries/output-clause-transact-sql menyatakan:
Jadi untuk mendapatkan ID asli, Anda harus memasukkannya dalam tabel tujuan agar klausa keluaran dapat mengulanginya, seperti:
meskipun mengubah skema objek target mungkin tidak praktis dalam situasi Anda sehingga ini mungkin tidak berlaku.
sumber