Подтвердить что ты не робот

Как вставить несколько записей и получить значение идентификатора?

Я вставляю несколько записей в таблицу 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.

4b9b3361

Ответ 1

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

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

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

Ответ 2

Используйте предложение 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

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

Ответ 3

Внимательно прочитав ваш вопрос, вы просто хотите обновить таблицу 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 нельзя отличить друг от друга.

Ответ 4

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

Ответ 5

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

Ответ 6

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

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

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

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

set identity_insert A on

Ответ 7

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

update B set NewID = NEWID()

insert into A(fname,lname,id) select fname,lname,NewID from B