13

Как получить идентификатор вставленной строки?

14

Как получить значение IDENTITY вставленной строки?

Я знаком с @@IDENTITY, IDENT_CURRENT и SCOPE_IDENTITY, но не понимаю, какие последствия или влияние связано с каждым из них. В чем разница между ними, и когда следует использовать каждое из этих значений?

5 ответ(ов)

1

@@IDENTITY возвращает идентификатор последней записи, вставленной соединением вашего клиента с базой данных.

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

SCOPE_IDENTITY() решает эту проблему. Он возвращает идентификатор последней записи, которую вы вставили в SQL-коде, который вы отправили в базу данных. Если триггеры создают дополнительные строки, это не повлияет на возвращаемое значение. Ура!

IDENT_CURRENT возвращает последний идентификатор, который был вставлен кем угодно. Если какая-то другая программа вставит строку в неподходящее время, вы получите идентификатор этой строки вместо вашего.

Если хотите подстраховаться, всегда используйте SCOPE_IDENTITY(). Если вы продолжите использовать @@IDENTITY, а позже кто-то решит добавить триггер, весь ваш код может сломаться.

0

Наилучший (то есть, самый безопасный) способ получить идентификатор только что вставленной строки — использовать оператор OUTPUT:

CREATE TABLE TableWithIdentity
(
    IdentityColumnName int IDENTITY(1, 1) NOT NULL PRIMARY KEY,
    ...
)

-- тип столбца этой таблицы должен соответствовать типу 
-- столбца идентификатора таблицы, в которую вы будете вставлять данные
DECLARE @IdentityOutput TABLE (ID int)

INSERT INTO TableWithIdentity
     ( ...)
OUTPUT inserted.IdentityColumnName INTO @IdentityOutput
VALUES
     ( ... )

SELECT @IdentityValue = (SELECT ID FROM @IdentityOutput)

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

0

Чтобы получить последний вставленный идентификатор после выполнения команды INSERT в SQL, добавьте в конец вашего SQL-запроса следующее:

SELECT CAST(scope_identity() AS int);

Таким образом, ваш полный запрос будет выглядеть примерно так:

INSERT INTO YourTable (Column1, Column2)
VALUES (Value1, Value2);
SELECT CAST(scope_identity() AS int);

Затем в вашем коде, после выполнения команды, вы можете использовать:

NewId = command.ExecuteScalar();

Это вернет последний вставленный идентификатор, который вы сможете использовать в своем приложении.

0

@@IDENTITY, SCOPE_IDENTITY и IDENT_CURRENT — это функции, которые возвращают последнее значение, вставленное в столбец IDENTITY таблицы.

@@IDENTITY и SCOPE_IDENTITY возвращают последнее сгенерированное значение идентификатора в любой таблице в текущей сессии. Однако, SCOPE_IDENTITY возвращает значение только в пределах текущего контекста; @@IDENTITY не ограничивается конкретным контекстом.

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

Вот несколько ключевых моментов, которые стоит помнить:

  • IDENT_CURRENT — это функция, которая принимает в качестве аргумента имя таблицы.
  • @@IDENTITY может вернуть запутанный результат, если на таблице есть триггер.
  • SCOPE_IDENTITY — это ваш герой в большинстве случаев.
0

Я не могу говорить о других версиях SQL Server, но в 2012 году вывод данных напрямую работает без проблем. Вам не нужно использовать временную таблицу.

INSERT INTO MyTable
OUTPUT INSERTED.ID
VALUES (...)

Кстати, этот метод также работает при вставке нескольких строк.

INSERT INTO MyTable
OUTPUT INSERTED.ID
VALUES
    (...),
    (...),
    (...)

Вывод:

ID
2
3
4
Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь