Я пишу оператор вставки для пакетной обработки и хотел бы использовать временную таблицу для отслеживания вставленных идентификаторов вместо того, чтобы самому циклически проходить по элементам и вызывать SCOPE_IDENTITY () для каждой вставленной строки.
Данные, которые необходимо вставить, имеют (временные) идентификаторы, связывающие их с другими данными, которые также должны быть вставлены в другую таблицу, поэтому мне нужна перекрестная ссылка на фактический идентификатор и временный идентификатор.
Это пример того, что я имею до сих пор:
-- 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
Проблема в том, что я не могу заставить предложение OUTPUT INTO принять ID, я пробовал @MyInsertData.ID
и другие приемы, соединяющие таблицу с самим собой, но, похоже, ничего не работает.