#sql #sql-server #tsql #sql-insert
Вопрос:
У меня есть две связанные таблицы примерно так:
CREATE TABLE test.items
(
id INT identity(1,1) PRIMARY KEY,
type VARCHAR(max),
price NUMERIC(6,2)
);
CREATE TABLE test.books
(
id INT PRIMARY KEY REFERENCES test.items(id),
title VARCHAR(max),
author VARCHAR(max)
);
Можно ли вставить в обе таблицы с помощью одной инструкции SQL?
В PostgreSQL я могу использовать что-то вроде этого:
-- PostgreSQL:
WITH item AS (INSERT INTO test.items(type,price) VALUES('book',12.5) RETURNING id)
INSERT INTO test.books(id,title) SELECT id,'Good Omens' FROM item;
но, по-видимому, SQL Server ограничивает CTE SELECT
операторами, так что это не сработает.
В принципе, я мог бы использовать это OUTPUT
предложение таким образом:
-- SQL Server:
INSERT INTO test.items(type, price)
OUTPUT inserted.id, 'Good Omens' INTO test.books(id,title)
VALUES ('book', 12.5);
но это не сработает, если задействован внешний ключ, как указано выше.
Я знаю об использовании переменных и процедур, но мне было интересно, существует ли простой подход с одним оператором.
Комментарии:
1. Нет, это не так. Вам придется вывести данные в табличную переменную. Разочаровывает, но так оно и есть. Обратите внимание , что вы не можете поместить
INSERT...OUTPUT
внутри другогоINSERT
, если вы еще не пробовали это
Ответ №1:
Вы можете использовать динамический sql следующим образом. Хотя так неудобно строить запрос.
CREATE TABLE dbo.items (
id INT identity(1,1) PRIMARY KEY,
type VARCHAR(max),
price NUMERIC(6,2)
);
CREATE TABLE dbo.books (
id INT PRIMARY KEY REFERENCES dbo.items(id),
title VARCHAR(max),
author VARCHAR(max)
);
insert into dbo.books(id,title)
exec ('insert into dbo.items(type,price) output inserted.id,''Good Omen'' VALUES(''book'',12.5)')