Piszę instrukcję wsadową przetwarzania wsadowego i chciałbym użyć tabeli tymczasowej, aby śledzić wstawione identyfikatory zamiast samodzielnie zapętlać elementy i wywoływać SCOPE_IDENTITY () dla każdego wstawionego wiersza.
Dane, które należy wstawić, mają (tymczasowy) identyfikator łączący je z innymi danymi, które również powinny zostać wstawione do innej tabeli, więc potrzebuję odsyłacza do rzeczywistego identyfikatora i tymczasowego identyfikatora.
Oto przykład tego, co mam do tej pory:
-- 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
Problem polega na tym, że nie mogę uzyskać klauzuli OUTPUT INTO, aby zaakceptować identyfikator, próbowałem @MyInsertData.ID
i inne sztuczki przyłączyły się do samej tabeli, ale nic nie działa.
źródło
Klauzula wyjściowa może uzyskiwać dostęp tylko do danych w docelowych wierszach i stałych / zmiennych, a nie do danych z innego źródła
SELECT
, tak jak w przypadku wyzwalacza.https://docs.microsoft.com/en-us/sql/t-sql/queries/output-clause-transact-sql stwierdza:
Aby uzyskać oryginalny identyfikator, należy go uwzględnić w tabeli docelowej, aby klauzula wyjściowa mogła go ponownie wywołać:
chociaż zmiana schematu obiektu docelowego może nie być praktyczna w twojej sytuacji, więc może nie mieć zastosowania.
źródło