Я пытаюсь вернуть значение ключа после оператора INSERT. Пример: у меня есть таблица с атрибутами name и id. id является сгенерированным значением.
INSERT INTO table (name) VALUES('bob');
Теперь я хочу вернуть идентификатор на том же этапе. Как это сделать?
Мы используем Microsoft SQL Server 2008.
sql
sql-server
sql-server-2008
melbic
источник
источник
Ответы:
Нет необходимости в отдельном SELECT ...
Это работает и для столбцов не-IDENTITY (например, GUID)
источник
Используйте,
SCOPE_IDENTITY()
чтобы получить новое значение идентификатораhttp://msdn.microsoft.com/en-us/library/ms190315.aspx
источник
id
это личностьid
, так что да.Это самая безопасная ставка, поскольку существует известная проблема с конфликтом предложения OUTPUT для таблиц с триггерами. Делает это довольно ненадежным, даже если в вашей таблице в настоящий момент нет триггеров - кто-то, добавивший один из них, сломает ваше приложение Time Bomb своего рода поведение.
См. Статью MSDN для более глубокого объяснения:
http://blogs.msdn.com/b/sqlprogrammability/archive/2008/07/11/update-with-output-clause-triggers-and-sqlmoreresults.aspx
источник
Entity Framework выполняет что-то похожее на ответ gbn:
Результаты вывода сохраняются во временной табличной переменной, а затем отбираются обратно клиенту. Нужно знать о Гоче:
Я понятия не имею, почему EF внутренне присоединяет эфемерную таблицу обратно к реальной таблице (при каких обстоятельствах эти две пары не совпадают).
Но это то, что делает EF.
SQL Server 2008 или новее только. Если это 2005, то вам не повезло.
источник
Customer
записи, поскольку на нее могут влиять другие логики на стороне DB, например,DEFAULT
в некоторых столбцах, триггеры в таблице и т. Д. EF обновляет Сущность (объект) используется для вставки, поэтому клиентская сторона получает объект customer с идентификатором, а все остальное представляет текущее состояние строки.@@IDENTITY
Системная функция, которая возвращает последнее вставленное значение идентификатора.источник
Есть много способов выйти после вставки
IDENT_CURRENT : возвращает последний идентификатор, созданный для конкретной таблицы или представления в любом сеансе.
SCOPE_IDENTITY : возвращает последний идентификатор из того же сеанса и той же области. Область действия - это хранимая процедура / триггер и т. Д.
@@ IDENTITY : возвращает последний идентификатор из того же сеанса.
источник
out put
дляbulk insert
и вставитьselect statement
. спасибо за ваше предложениеЛучшее и самое верное решение - использовать
SCOPE_IDENTITY()
.Просто вы должны получить идентификатор области после каждой вставки и сохранить его в переменной, потому что вы можете вызвать две вставки в одной и той же области.
ident_current
и,@@identity
возможно, они работают, но они не являются безопасным объемом Вы можете иметь проблемы в большом приложенииБолее подробно здесь Microsoft документы
источник
select @duplicataId = SCOPE_IDENTITY()
OUTPUT
это лучшее, более чистое решение :)Ты можешь использовать
scope_identity()
чтобы выбрать идентификатор строки, которую вы только что вставили в переменную, а затем просто выбрать любые столбцы из этой таблицы, где id = идентификатор, который вы получилиscope_identity()
См. Здесь для получения информации MSDN http://msdn.microsoft.com/en-us/library/ms190315.aspx
источник
Есть несколько способов получить последний вставленный идентификатор после команды вставки.
@@IDENTITY
Возвращает последнее значение идентификатора, сгенерированное для соединения в текущем сеансе, независимо от таблицы и области действия оператора, создавшего значение.SCOPE_IDENTITY()
Возвращает последнее значение идентификатора, созданное оператором вставки в текущей области в текущем соединении, независимо от таблицы.IDENT_CURRENT(‘TABLENAME’)
Возвращает последнее значение идентификатора, созданное в указанной таблице, независимо от соединения, сеанса или области действия. IDENT_CURRENT не ограничен областью действия и сессией; он ограничен указанной таблицей.Теперь кажется, что труднее решить, какой из них будет точно соответствовать моему требованию.
Я в основном предпочитаю SCOPE_IDENTITY ().
Если вы используете select SCOPE_IDENTITY () вместе с TableName в инструкции вставки, вы получите точный результат в соответствии с вашими ожиданиями.
Источник: CodoBee
источник
Вот как я использую OUTPUT INSERTED при вставке в таблицу, которая использует ID в качестве столбца идентификаторов в SQL Server:
источник
Вы можете добавить оператор select к вашему оператору вставки. Integer myInt = Вставить в таблицу1 (FName) значения («Фред»); Выберите Scope_Identity (); Это вернет значение идентичности при выполнении скалера.
источник
После вставки в таблицу со столбцом идентификаторов вы можете обратиться к @@ IDENTITY, чтобы получить значение: http://msdn.microsoft.com/en-us/library/aa933167%28v=sql.80%29.aspx
источник
* Порядок параметров в строке подключения иногда важен. * Расположение параметра Provider может нарушать курсор набора записей после добавления строки. Мы видели такое поведение с поставщиком SQLOLEDB.
После добавления строки поля строки недоступны, ЕСЛИ НЕ указан поставщик в качестве первого параметра в строке подключения. Когда поставщик находится где-либо в строке подключения, кроме как в качестве первого параметра, вновь вставленные поля строки недоступны. Когда мы переместили провайдера к первому параметру, поля строки волшебным образом появились.
источник