Получение первичного ключа недавно вставленной строки в 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()
для извлечения последнего вставленного первичного ключа.