Помогите с сценарием T-SQL: вставить запись, а затем использовать идентификатор этой вставки в другом выражении - PullRequest
6 голосов
/ 01 марта 2011

Как предисловие, я не очень разбираюсь в синтаксисе T-SQL.

Я хотел бы создать простой сценарий SQL, который будет делать 3 оператора вставки.

Insert A
Insert B
Insert C

Вставка Идентификационные данные оператора или «ID» будут необходимы в операторе вставки B. И обе вставки A и B для идентификаторов потребуются в операторе Insert C.

Псевдокод будет выглядеть примерно так:

INSERT INTO tableA
VALUES ('blah', 'blah')

INSERT INTO tableB
VALUES (IDENTITY_FROM_A_INSERT, 'foo')

INSERT INTO tableC
VALUES (IDENTITY_FROM_A_INSERT, IDENTITY_FROM_B_INSERT)

Как мне написать этот сценарий?

Ответы [ 2 ]

19 голосов
/ 01 марта 2011

Используйте SCOPE_IDENTITY() после каждой вставки, чтобы получить идентификатор вставленной строки (в текущем сеансе).

Я использовал две переменные, чтобы захватить две идентичности, а затем вставить их в третью таблицу:

DECLARE @Id1 INT
DECLARE @Id2 INT

INSERT INTO tableA VALUES ('blah', 'blah')

SET @Id1 = SELECT SCOPE_IDENTITY()

INSERT INTO tableB VALUES (IDENTITY_FROM_A_INSERT, 'foo')

SET @Id2 = SELECT SCOPE_IDENTITY()

INSERT INTO tableC VALUES (@Id1, @Id2)
2 голосов
/ 01 марта 2011

scope_identity() идеально подходит для целочисленных идентификаторов при вставке одной записи (от +1 до другой ответ кстати).Однако, если вы обнаружите, что используете guid / uniqueidentifier (newsequentialid(), newid() и т. Д.) Или вставляете несколько записей одновременно, вынужно что-то немного другое:

declare @id uniqueidentifier;
-- Table variable for storing your newly inserted identifiers:
declare @NewlyInsertedIds table 
(
   [Id] uniqueidentifier
);

insert [MyTable]
(
   [Blah1]
  ,[Blah2]
)
-- in the output clause you can access the inserted/deleted pseudo tables:
ouptut inserted.[Id]
into @NewlyInsertedIDs
(
   [Id]
)
values
(
   'Blah'
  ,'Blah'
);

select
 @id = [Id]
from @NewlyInsertedIds;

Изучите предложение OUTPUT для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...