Я пишу оператор вставки для пакетной обработки и хотел бы использовать временную таблицу для отслеживания вставленных идентификаторов вместо того, чтобы самому циклически проходить по элементам и вызывать 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
и другие приемы, соединяющие таблицу с самим собой, но, похоже, ничего не работает.
источник
Предложение output может обращаться только к данным в целевых строках и константах / переменных, но не к данным из другого источника
SELECT
, например, если вы работали в триггере.https://docs.microsoft.com/en-us/sql/t-sql/queries/output-clause-transact-sql заявляет:
Таким образом, чтобы получить исходный идентификатор, вам нужно будет включить его в таблицу назначения, чтобы предложение output могло вернуть его обратно, например так:
хотя изменение схемы целевого объекта может быть непрактичным в вашей ситуации, поэтому это может быть неприменимо.
источник