Оператор вставки SQL Server, используя INSERTED, чтобы получить новый идентификатор и существующий идентификатор - PullRequest
5 голосов
/ 02 июля 2010

Я вставляю записи с одного сервера базы данных 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

Ответы [ 2 ]

5 голосов
/ 02 июля 2010

Вы не можете сделать это с помощью 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 ;
1 голос
/ 02 июля 2010

Поместите поле идентификатора конверсии в таблицу.Это не загрязняет таблицу, это решает проблему должным образом.Кроме того, вы можете вернуть его обратно в предложение вывода.И это также упростит обновление дочерних таблиц.Я не вижу никакой причины вообще не делать этого, если у вас нет плохих разработчиков, которые используют Select * в рабочем коде.

...