#sql #sql-server-2008
#sql #sql-server-2008
Вопрос:
Вставить SCOPE_IDENTITY
во время вставки?
У меня есть два шага для выполнения этой работы:
INSERT INTO MyDB (Name, Path, File)
VALUES ('1', 'D:', '1.Pdf') SELECT SCOPE_IDENTITY() AS ID;
INSERT INTO OtherDB (New, Barcode, FileId)
VALUES ('2', '1', ID);
Значение ID
во второй вставке берется из SCOPE_IDENTITY()
, возвращенного из первого SQL.
Есть ли какой-нибудь способ сделать это за один шаг?
Например:
INSERT INTO OtherDB (New, Barcode, FileId)
VALUES ('2', '1', INSERT INTO MyDB (Name, Path, File)
VALUES ('1', 'D:', '1.Pdf') SELECT SCOPE_IDENTITY() AS ID);
Комментарии:
1. Почему вы используете неподдерживаемую версию SQL Server?
Ответ №1:
Я согласен с @GordonLinoff, что OUTPUT
предложение здесь полезно. Добавление, которое также можно использовать OUTPUT
для вставки в 2 разные таблицы в одном INSERT
заявлении.
INSERT INTO MyDB (Name, Path, [File])
OUTPUT '2', '1', inserted.ID INTO OtherDB
VALUES ('1', 'D:', '1.Pdf');
Ответ №2:
Это намного, намного безопаснее использовать OUTPUT
:
declare @ids table (id int);
Insert Into MyDB (Name, Path, File)
output inserted.id into @ids
Values ('1' ,'D:', '1.Pdf');
insert into otherdb (New, Barcode, FileId)
select '2', '1', i.id
from @ids i;
Что касается вашего вопроса, для этого в основном требуются две вставки, потому что вы хотите вставить в две таблицы. Вы могли бы обойти это, создав представление, объединяющее две таблицы, и используя триггер в представлении.
Комментарии:
1. Разве это не обязательно должно быть
declare @ids table (id int);
?? Я думаю, вам не хватаетtable
ключевого слова