Получение первичного ключа недавно вставленной строки в SQL Server 2008

У меня есть куча данных, которые будут вставляться в таблицу. Эта проблема заключается в том, что мне нужно вернуть первичный ключ в эту таблицу. Я не был уверен, были ли такие вещи, как:

 insert into TABLE (...) values (...) RETURNING p_key

или

 select p_key from (insert into TABLE (...) values (...))

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

Я смотрел онлайн и нашел несколько примеров через Google, но это немного смутило меня с этими примерами.

http://en.wikipedia.org/wiki/Insert_(SQL)#Retrieving_the_key

http://www.daniweb.com/web-development/databases/ms-sql/threads/299356/returning-identity-of-last-inserted-row-uniqueidentifier

Википедия говорила, что для SQL Server 2008 использовать OUTPUT вместо RETURNING, можно использовать что-то вроде OUTPUT p_key

Ответ 1

Если вы вставляете целый ряд строк, выбор SCOPE_IDENTITY() не будет выполняться. И SCOPE_IDENTITY также работает только для (числовых) столбцов идентичности - иногда ваш ПК - это что-то еще...

Но SQL Server действительно есть OUTPUT положение - и это очень хорошо документировано на MSDN!

INSERT INTO dbo.Table(columns)
OUTPUT INSERTED.p_key, INSERTED.someothercolumnhere .......
VALUES(...) 

Эти значения будут "возвращаться" обратно в вызывающее приложение, например, вы увидите их в сетке в SQL Server Management Studio, или вы можете прочитать их как результат набора из вашего С# или VB.NET, вызывающего этот оператор INSERT.

Ответ 2

Scope_Identity() - это то, что вы хотите, считая, что под "первичным ключом" вы подразумеваете "Identity"

declare @id int 
insert yourtable values (some, values)
select @id = Scope_Identity()

Ответ 3

В C#, сразу после вашего SQL-оператора, напишите SELECT SCOPE_IDENTITY(); поэтому ваш код будет:

insert into TABLE (...) values (...); SELECT SCOPE_IDENTITY();

то вместо executeNonQuery используйте executeScalar.

Это должно делать свое дело!

Ответ 4

После выполнения вставки запрос:

select scope_identity()

для извлечения последнего вставленного первичного ключа.