Как вставить результаты OUTPUT в одну таблицу в одном запросе? - PullRequest
0 голосов
/ 06 мая 2019

У меня есть таблица с именем ItemTable, в которой есть столбцы:

ID (identity col int), primary key, foreign key constraint with ProductTable

Col (varchar(50))

ColOther (varchar(50))

Latest (bit)

Time (autogenerated datetime)

Я делаю запрос:

UPDATE ItemTable
SET Col = 'new', ColOther = 'newother'
OUTPUT deleted.Col, deleted.ColOther
WHERE ID = 100;

, который прекрасно обновляет строку и даетправильный вывод:

| Col       | ColOther |
| --------- |:--------:|
| old       | oldother |

Я хотел бы INSERT этот вывод (и константа Latest = 0) к тому же ItemTable в том же UPDATE оператор.

Я пытался:

INSERT INTO ItemTable (Col, ColOther, Latest)
UPDATE ItemTable
SET Col = 'new', ColOther = 'newother'
OUTPUT deleted.Col, deleted.ColOther, 0
WHERE ID = 100;

, что выдает ошибку:

Неверный синтаксис рядом с ключевым словом "ОБНОВЛЕНИЕ".

И:

UPDATE ItemTable
SET Col = 'new', ColOther = 'newother'
OUTPUT deleted.Col, deleted.ColOther, 0 INTO ItemTable
WHERE ID = 100;

, что приводит к ошибке:

Таблица назначения ItemTable предложения OUTPUT INTO не может быть по обе стороны ототношение (первичный ключ, внешний ключ).Найдено ссылочное ограничение 'FK_ProductTable_ItemTable'.

1 Ответ

2 голосов
/ 06 мая 2019

Вы не можете сделать это в одном операторе.
Вы должны использовать один оператор для обновления и один для вставки.
Однако вы можете сделать это в транзакции, чтобы в случае сбоя вставки выможно откатить обновление:

DECLARE @updated TABLE (Col varchar(50), ColOther varchar(50))

BEGIN TRANSACTION
BEGIN TRY

UPDATE ItemTable
SET Col = 'new', ColOther = 'newother'
OUTPUT deleted.Col, deleted.ColOther INTO @updated
WHERE ID = 100

INSERT INTO ItemTable (Col, ColOther, Latest)
SELECT Col, ColOther, 0
FROM @updated

COMMIT TRANSACTION
END TRY

BEGIN CATCH
    IF @@TRANCOUNT > 0
        ROLLBACK TRANSACTION
END CATCH
...