Вставить SCOPE_IDENTITY во время вставки?

#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 ключевого слова