SQL Server - возвращаемое значение после INSERT - PullRequest
266 голосов
/ 27 октября 2011

Я пытаюсь вернуть значение ключа после оператора INSERT. Пример: У меня есть таблица с атрибутами name и id. id - это сгенерированное значение.

    INSERT INTO table (name) VALUES('bob');

Теперь я хочу вернуть идентификатор на том же этапе. Как это сделать?

Мы используем Microsoft SQL Server 2008.

Ответы [ 12 ]

420 голосов
/ 27 октября 2011

Нет необходимости в отдельном SELECT ...

INSERT INTO table (name)
OUTPUT Inserted.ID
VALUES('bob');

Это работает и для столбцов без идентификатора (таких как GUID)

165 голосов
/ 27 октября 2011

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

INSERT INTO table (name) VALUES('bob');

SELECT SCOPE_IDENTITY()

http://msdn.microsoft.com/en-us/library/ms190315.aspx

38 голосов
/ 25 июня 2015
INSERT INTO files (title) VALUES ('whatever'); 
SELECT * FROM files WHERE id = SCOPE_IDENTITY();

Самая безопасная ставка, поскольку существует известная проблема с конфликтом предложения OUTPUT для таблиц с триггерами.Делает это довольно ненадежным, даже если в вашей таблице в настоящий момент нет триггеров - кто-то, добавивший один из них, сломает ваше приложение.Поведение типа Time Bomb.

Более подробное объяснение см. В статье MSDN:

http://blogs.msdn.com/b/sqlprogrammability/archive/2008/07/11/update-with-output-clause-triggers-and-sqlmoreresults.aspx

24 голосов
/ 04 ноября 2016

Entity Framework выполняет что-то похожее на ответ gbn:

DECLARE @generated_keys table([Id] uniqueidentifier)

INSERT INTO Customers(FirstName)
OUTPUT inserted.CustomerID INTO @generated_keys
VALUES('bob');

SELECT t.[CustomerID]
FROM @generated_keys AS g 
   JOIN dbo.Customers AS t 
   ON g.Id = t.CustomerID
WHERE @@ROWCOUNT > 0

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

вставки могут генерировать более одной строки, поэтому переменная может содержать более одной строки, поэтому вам может быть возвращено более одной ID

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

Но это то, что делает EF.

SQL Server 2008 или новее только. Если это 2005, значит, вам не повезло.

10 голосов
/ 12 октября 2017

@@ IDENTITY Системная функция, которая возвращает последнее введенное значение идентификатора.

4 голосов
/ 27 октября 2011

Вы можете использовать scope_identity, чтобы выбрать идентификатор строки, которую вы только что вставили в переменную, а затем просто выбрать любые столбцы, которые вы хотите из этой таблицы, где id = идентификатор, который вы получили из scope_identity

См. Здесь информацию о MSDN http://msdn.microsoft.com/en-us/library/ms190315.aspx

3 голосов
/ 17 октября 2018

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

  declare @duplicataId int
  select @duplicataId =   (SELECT SCOPE_IDENTITY())

Подробнее здесь Документы Microsoft

0 голосов
/ 04 января 2019

Это может быть немного старой школы, но есть много людей, использующих более старый PHP, а точнее Pre 5.5. Более подробную информацию можно найти на http://php.net/manual/en/function.mysql-insert-id.php

$last = mysql_insert_id();
0 голосов
/ 07 января 2018

Вы можете добавить оператор выбора в оператор вставки.Integer myInt = Вставить в таблицу1 (FName) значения ('Фред');Выберите Scope_Identity ();Это вернет значение идентификатора при выполнении скалера.

0 голосов
/ 27 февраля 2016

Вот как я использую OUTPUT INSERTED при вставке в таблицу, в которой идентификатор используется в качестве столбца идентификаторов в SQL Server:

'myConn is the ADO connection, RS a recordset and ID an integer
Set RS=myConn.Execute("INSERT INTO M2_VOTELIST(PRODUCER_ID,TITLE,TIMEU) OUTPUT INSERTED.ID VALUES ('Gator','Test',GETDATE())")
ID=RS(0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...