Как мне обновить таблицу на основе сгенерированного индексного ключа вставки?

#sql #sql-server-2008

#sql #sql-server-2008

Вопрос:

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

Я вполне мог бы просто обновить свою временную таблицу после первой вставки, но я хотел бы попробовать использовать предложение output .

Я хочу что-то вроде этого:

 INSERT INTO Table1
<values from temp table>
OUTPUT <update my temp table with generated identity keys>

INSERT INTO Table2
<values from temp table including the output updated id column>
  

Комментарии:

1. вы всегда можете запросить основную таблицу с помощью max(id), выполнить итерацию по единице и установить ее в качестве переменной для последующего использования.

Ответ №1:

Я думаю, вам лучше создать другую временную таблицу (ИЛИ) переменную табличного типа и перейти оттуда, как показано ниже. Потому что я не думаю, что вы можете обновить ту же временную таблицу, из которой вы вставляете output предложение using .

 CREATE TABLE TestTable (ID INT not null identity primary key, 
                        TEXTVal VARCHAR(100))

create TABLE #tmp(ID INT, TEXTVal VARCHAR(100))

create TABLE #tmp1(ID INT, TEXTVal VARCHAR(100))

CREATE TABLE TestTable1 (ID INT not null, TEXTVal VARCHAR(100))


INSERT #tmp (ID, TEXTVal)
VALUES (1,'FirstVal')

INSERT #tmp (ID, TEXTVal)
VALUES (2,'SecondVal')


INSERT INTO TestTable (TEXTVal)
OUTPUT Inserted.ID, Inserted.TEXTVal INTO #tmp1
select TEXTVal from #tmp

INSERT INTO TestTable1 (ID, TEXTVal)
select ID, TEXTVal from #tmp1
  

Ответ №2:

Вы могли merge temptable бы ввести Table1 и вывести результаты в таблицу переменных, а затем вставить исходные данные, соединенные с таблицей переменных Table2 .

Пример:

 DECLARE @MyIDs TABLE (TempTableID int NOT NULL, Table1ID int NOT NULL)

MERGE INTO Table1 
USING TempTable AS Tmp
    ON Table1.SomeValue = Tmp.SomeValue
WHEN NOT MATCHED THEN
    INSERT (col1, col2, col3, col4, col5)
    VALUES (tmp.col1, tmp.col2, tmp.col3, tmp.col4, tmp.col5)
OUTPUT Tmp.ID
      ,Table1.ID
INTO @MyIDs;

INSERT INTO Table2 (col1, col2, col3, col4, col5, Table1ID)
SELECT tmp.col1, tmp.col2, tmp.col3, tmp.col4, tmp.col5, new.Table1ID
FROM TempTable tmp
JOIN @MyIDs new ON tmp.ID = new.TempTableID