Я пытаюсь создать таблицу сопоставления, чтобы связать идентификаторы новых строк в таблице с теми, из которых они скопированы. Предложение OUTPUT INTO кажется идеальным для этого, но, похоже, оно не работает в соответствии с документацией.
Мой код:
DECLARE @Missing TABLE (SrcContentID INT PRIMARY KEY )
INSERT INTO @Missing
( SrcContentID )
SELECT cshadow.ContentID
FROM Private.Content AS cshadow
LEFT JOIN Private.Content AS cglobal ON cshadow.Tag = cglobal.Tag
WHERE cglobal.ContentID IS NULL
PRINT 'Adding new content headers'
DECLARE @Inserted TABLE (SrcContentID INT PRIMARY KEY, TgtContentID INT )
INSERT INTO Private.Content
( Tag, Description, ContentDate, DateActivate, DateDeactivate, SortOrder, CreatedOn, IsDeleted, ContentClassCode, ContentGroupID, OrgUnitID )
OUTPUT cglobal.ContentID, INSERTED.ContentID INTO @Inserted (SrcContentID, TgtContentID)
SELECT Tag, Description, ContentDate, DateActivate, DateDeactivate, SortOrder, CreatedOn, IsDeleted, ContentClassCode, ContentGroupID, NULL
FROM Private.Content AS cglobal
INNER JOIN @Missing AS m ON cglobal.ContentID = m.SrcContentID
Результаты в сообщении об ошибке:
Msg 207, Level 16, State 1, Line 34
Invalid column name 'SrcContentID'.
(строка 34 с выходом INTO)
Эксперименты показывают, что только те строки, которые действительно присутствуют в целевом объекте INSERT, могут быть выбраны в OUTPUT INTO. Но это противоречит документам в онлайн-книгах. В статье о OUTPUT Clause есть пример E, в котором описывается подобное использование:
Предложение OUTPUT INTO возвращает значения
из таблицы обновляется
(WorkOrder), а также из продукта
Таблица. Таблица Product используется в
предложение FROM для указания строк
обновить.
Кто-нибудь работал с этой функцией?
(Тем временем я переписал свой код, чтобы выполнить работу, используя цикл курсора, но это ужасно, и мне все еще любопытно)