Я вставляю записи от одного дб SQL-сервера в другого. Я должен получить недавно вставленный идентификатор и обновить поле на исходной таблице. Я могу получить новый идентификатор с опцией INSERTED без проблем. Однако я, может казаться, не получаю идентификатор из исходной таблицы. Конечная таблица не имеет поля для идентификатора источника. Исходная таблица является таблицей преобразования, и я не хочу загрязнять конечную таблицу полями преобразования. Это не может быть возможно, но я думал, что сначала согласую с Вами парни.
drop table #Table1
CREATE TABLE #Table1
(
Table1ID INT,
Table2ID INT,
NAME VARCHAR(32)
)
INSERT INTO #Table1
VALUES
(1, NULL, 'Fred')
,(2, NULL, 'Tom')
,(3, NULL, 'Sally')
--ok, im inserting into #Table2
drop table #Table2
CREATE TABLE #Table2
(
[Table2ID] [int] IDENTITY(1,1) NOT NULL,
NAME VARCHAR(32)
)
--THE RUB, I want to insert Table2ID into table3
--along with Table1ID. I cannot seem to reference table1
--Any Ideas?
insert into #Table2(NAME)
OUTPUT INSERTED.Table2ID, T.Table1ID into #Table3
select Name from #Table1 T
Вы не можете сделать это с помощью INSERT (так как в нем отсутствует собственное предложение FROM), но вы можете сделать это с помощью MERGE:
MERGE INTO #Table2 as t2
USING #Table1 as t1 ON 0=1
WHEN NOT MATCHED BY TARGET THEN
INSERT (NAME) VALUES (t1.NAME)
OUTPUT INSERTED.Table2ID, t1.Table1ID ;
Поместите поле идентификатора преобразования в таблицу. Это не загрязняет стол, а правильно решает проблему. Кроме того, вы можете вернуть его в предложении вывода. И это также упростит обновление дочерних таблиц. Я не вижу причин не делать этого, если у вас нет плохих разработчиков, которые используют Select * в производственном коде.