Какой из них является лучшим вариантом, чтобы получить значение идентификатора, я просто формируется вставить? Каково влияние этих высказываний С точки зрения производительности?
Функция scope_identity()
топ-1
IdentityColumn от того Имя_таблицы по IdentityColumn деск
Используйте функция scope_identity()` если вы вставляете одну строку и хотите получить идентификатор, который был сгенерирован.
CREATE TABLE #a(identity_column INT IDENTITY(1,1), x CHAR(1));
INSERT #a(x) VALUES('a');
SELECT SCOPE_IDENTITY();
Результат:
----
1
Используйте "вывод" п. при вставке нескольких строк и нужно получить установка идентификаторов, которые были созданы.
INSERT #a(x)
OUTPUT inserted.identity_column
VALUES('b'),('c');
Результат:
----
2
3
> и почему это лучший вариант быстрее?
В сторону производительности, это только те, что гарантированно правильного уровня изоляции по умолчанию и/или с несколькими пользователями. Даже если вы игнорируете правильность аспект, хранит введенное значение в поле `функция scope_identity () в памяти, поэтому, естественно, это будет быстрее, чем ходить и запуск собственного единичный запрос к таблице или к таблицам системы.
Игнорируя правильность аспекта, как говорил почтальон он сделал хорошую работу по доставке сегодня's Почта - он закончил свой путь на 10 минут быстрее, чем его обычное время, проблема в том, что никто из почта была доставлена на дом.
Не использовать любой из следующих:
Функция@@Identity
- поскольку это может'т быть использованы во всех сценариях, например, когда таблица со столбцом идентификаторов содержит триггер, который также вставки в другую таблицу с собственным идентификатором столбца - вы получите неверное значение.Функция ident_current()
- я вдаваться в подробности об этом здесь, и комментарии являются полезным чтением, но, по сути, под параллелизма, часто можно получить неправильный ответ.Макс()
или ТОП-1
- тебе пришлось бы защищать два заявления с изоляции Serializable для того, чтобы гарантировать, что максимум()
вы не'т кто-то другой'ов. Это гораздо дороже, чем просто с помощью функции scope_identity()`.Эти функции также терпеть неудачу всякий раз, когда вы вставить два или более строк, и нужны все значения идентификаторов создается - ваша единственная опция есть пункт Выход
.
Помимо производительности, все они имеют довольно разный смысл.
`Функция scope_identity () даст вам последнее значение идентификатора, вставленное в любой таблица непосредственно в текущей области (объем = пакета, хранимой процедуры и т. д. но не в рамках, скажем, триггер, который был произведен по текущей области).
`Функция ident_current () даст вам последнее значение идентификатора, вставленное в определенной таблицы из любой область, к любым пользователей.
Функция@@Identity
дает вам последнее значение идентификатора, созданное по самым последним Insert для текущего соединения, независимо от таблицы или области. (Примечание: доступа использует эту функцию, и, следовательно, имеет некоторые проблемы с триггерами, что вставка значений в таблицы со столбцами идентификаторов.)
С помощью функции Max()или
ТОП-1может дать вам совершенно неправильные результаты, если в таблице есть негативный шаг идентичности, или уже вставленных строк с
установить параметр identity_insert` в игре. Здесь'ы сценарий демонстрирует все эти:
CREATE TABLE ReverseIdent (
id int IDENTITY(9000,-1) NOT NULL PRIMARY KEY CLUSTERED,
data char(4)
)
INSERT INTO ReverseIdent (data)
VALUES ('a'), ('b'), ('c')
SELECT * FROM ReverseIdent
SELECT IDENT_CURRENT('ReverseIdent') --8998
SELECT MAX(id) FROM ReverseIdent --9000
SET IDENTITY_INSERT ReverseIdent ON
INSERT INTO ReverseIdent (id, data)
VALUES (9005, 'd')
SET IDENTITY_INSERT ReverseIdent OFF
SELECT IDENT_CURRENT('ReverseIdent') --8998
SELECT MAX(id) FROM ReverseIdent --9005
Резюме: ручка с функцией scope_identity(),
функция ident_current(), или
функция@@Identity`, и убедитесь, что вы're, используя тот, что возвращает то, что вам действительно нужно.