Могу ли я вставить несколько связанных таблиц в одну инструкцию?

#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)')