Вставте за допомогою OUTPUT, пов'язаного з таблицею підзапитів


22

Я змінюю структуру бази даних. Вміст декількох стовпців таблиці Фінансова установа повинен бути переданий у таблицю Особа . Фінансова установа пов'язана з Особою із іноземним ключем. Кожна фінансова установа потребує посвідчення особи відповідної особи. Отже, для кожного нового рядка, вставленого в Person, ідентифікатор цього нового рядка (IDENTITY) повинен бути скопійований назад у відповідний рядок FinancialInstitution.

Очевидним способом цього є ітеративний код T-SQL. Але мені цікаво дізнатись, чи можна це робити лише за допомогою операцій на основі заданих операцій.

Я уявляв, що внутрішній рівень такого запиту буде чимось таким:

INSERT INTO Person (Street1, Number1, City1, State1, PostCode1, CountryId1, WorkDirectPhone1, Fax1, Email1)
OUTPUT inserted.Id, FinancialInstitution.Id
SELECT Id, Street, Number, City, [State], PostCode, CountryId, PhoneNumber, Fax, Email
FROM FinancialInstitution;

На жаль, схоже, що OUTPUT не може співвіднести це…


Ви хочете вставити рядки в таблицю Person? Або оновити існуючі? Або ви хочете вставити Personі потім UPDATE FinancialInstitution?
ypercubeᵀᴹ

Ваш запит оновлює лише таблицю Person. Ви можете зафіксувати вставлений.ID, але не FinancialInstitution.ID, якщо ви не використовуєте його у частині вставки. У тому випадку, як відповідає ваш запит, якщо ви видалили пункт OUTPUT, ви отримаєте помилку, оскільки кількість стовпців у вашому вкладенні INSERT не відповідає оператору SELECT.
datagod

ypercube: Я хочу вставити в Person, а потім оновити FinancialInstitution з ідентифікатором нового рядка в Person.
Юго Амаріл

datagod: Я знаю лише його оновлення, цей запит є вкладеним рівнем майбутнього рішення. Але я вже застряг там. Правильно, я не можу додати Id до виділення, якщо не вставляю його.
Юго Амаріл

1
@YugoAmaryl, ви можете спробувати прийняти цей приклад, використовуючи пункт OUTPUT для
фіксації

Відповіді:


18

Я думаю, ви могли б (аб) використовувати MERGEдля цього. Спочатку створіть (тимчасову) таблицю:

CREATE TABLE tempIDs
( PersonId INT, 
  FinancialInstitutionId INT
) ;

Потім MERGEу Person(замість INSERT), так що ви можете використовувати стовпці таблиць, задіяних у OUTPUTпункті:

MERGE INTO Person 
USING FinancialInstitution AS fi
  ON 1 = 0
WHEN NOT MATCHED THEN
  INSERT (Street1, Number1, City1, ...)
  VALUES (fi.Street, fi.Number, fi.City, ...)
OUTPUT inserted.Id, fi.Id
  INTO tempIDs ;

Потім використовуйте таблицю темп для UPDATE FinancialInstitution:

UPDATE fi
SET fi.PersonId = t.PersonId
FROM FinancialInstitution AS fi
  JOIN tempIDs AS t
    ON fi.Id = t.FinancialInstitutionId ; 

Тест за адресою: SQL-Fiddle

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.