Как вставить несколько записей и получить значение идентификатора? - PullRequest
52 голосов
/ 18 сентября 2008

Я вставляю несколько записей в таблицу A из другой таблицы B. Есть ли способ получить значение идентификатора записи таблицы A и обновить запись таблицы b без выполнения курсора?

Create Table A
(id int identity,
Fname nvarchar(50),
Lname nvarchar(50))

Create Table B
(Fname nvarchar(50),
Lname nvarchar(50),
NewId int)

Insert into A(fname, lname)
SELECT fname, lname
FROM B

Я использую MS SQL Server 2005.

Ответы [ 7 ]

144 голосов
/ 19 сентября 2008

Используйте предложение ouput из 2005:

DECLARE @output TABLE (id int)

Insert into A (fname, lname)
OUTPUT inserted.ID INTO @output
SELECT fname, lname FROM B

select * from @output

теперь ваша табличная переменная содержит значения идентификаторов всех вставляемых вами строк.

5 голосов
/ 18 сентября 2008

Внимательно читая ваш вопрос, вы просто хотите обновить таблицу B на основе новых значений идентификаторов в таблице A.

После завершения вставки просто запустите обновление ...

UPDATE B
SET NewID = A.ID
FROM B INNER JOIN A
     ON (B.FName = A.Fname AND B.LName = A.LName)

Предполагается, что комбинация FName / LName может использоваться для сопоставления записей между таблицами. Если это не так, вам может потребоваться добавить дополнительные поля, чтобы обеспечить правильное соответствие записей.

Если у вас нет альтернативного ключа, который позволяет сопоставлять записи, тогда это вообще не имеет смысла, поскольку записи в таблице B невозможно отличить друг от друга.

0 голосов
/ 18 сентября 2008

MBelly оправдывает себя - но тогда триггер всегда будет пытаться обновить таблицу B, даже если это не требуется (потому что вы также вставляете из таблицы C?).

Даррен здесь тоже прав, вы не можете вернуть несколько идентификаторов в качестве результирующего набора. Ваши варианты - использование курсора и получение идентификатора для каждой вставляемой строки или использование подхода Даррена для сохранения идентификатора до и после. Если вы знаете приращение идентификатора, это должно работать, если вы уверены, что таблица заблокирована для всех трех событий.

Если бы это был я, и это не было критично ко времени, я бы пошел с курсором.

0 голосов
/ 18 сентября 2008

Я предлагаю использовать тип уникального идентификатора вместо идентификатора. В этом случае вы можете сгенерировать идентификаторы перед вставкой:

update B set NewID = NEWID()

insert into A(fname,lname,id) select fname,lname,NewID from B
0 голосов
/ 18 сентября 2008

Насколько я понимаю, проблема, с которой вы столкнулись, заключается в том, что вы хотите ВСТАВИТЬ в таблицу A, в которой есть столбец идентификаторов, и хотите сохранить идентичность из таблицы B, в которой этого нет.

Чтобы сделать это, вам просто нужно включить идентификационную вставку в таблице А. Это позволит вам определить свои идентификаторы на вставке, и до тех пор, пока они не конфликтуют, с вами все будет в порядке. Тогда вы можете просто сделать:

Insert into A(identity, fname, lname) SELECT newid, fname, lname FROM B

Не уверен, какую БД вы используете, но для сервера sql команда включения идентификационной вставки будет:

set identity_insert A on
0 голосов
/ 18 сентября 2008

Вы можете получить, присоединившись к номеру строки . Это возможно, потому что, поскольку это идентичность, она будет увеличиваться при добавлении элементов в порядке их выбора.

0 голосов
/ 18 сентября 2008

Если вы всегда хотите такое поведение, вы можете поместить триггер AFTER INSERT в TableA, который обновит таблицу B.

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