IDENT_CURRENT возвращает последнее значение идентификатора, но SCOPE_IDENTITY - нет - PullRequest
3 голосов
/ 22 февраля 2012

У меня есть SQL Server в качестве бэкэнда для приложения asp.net. Несколько человек могут вставить данные в одну и ту же таблицу «в одно и то же время ...».

Когда я читаю решение / ответ из этого поста: scope_identity vs ident_current

ТОГДА мне не следует использовать Ident_current, потому что я могу получить идентификатор вставки другого пользователя.

Но использование Select Scope_Identity(); возвращает мне значение NULL, тогда как Select IDENT_CURRENT('tableName') возвращает мне правильный идентификатор, который я проверил в SQL Server Management Studio.

Оператор вставки, который я делаю в SqlTransaction. Select IDENT_CURRENT('tableName') выполняется после транзакции.

Что я не прав?

UPDATE

Мой оператор вставки, который динамически создается базовым классом:

INSERT INTO TEST (NAME) VALUES (@Name)

Коллекция параметров команды имеет значение "xxx", и все отлично вставлено в таблицу.

Я НЕ использую хранимые процедуры только в чистом виде SqlDataReader с C #.

commandText = "INSERT INTO TEST (NAME) VALUES ('Test1');Select Scopy_Identity();"

Как я могу получить последний auto inc id, выполняющий вышеприведенный оператор, и я должен позвонить ExecuteNonQuery или ExecuteReader для вышеупомянутого, потому что у него есть INSERT и SELECT, что сбивает с толку ...

Ответы [ 2 ]

14 голосов
/ 30 сентября 2012

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

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

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

5 голосов
/ 22 февраля 2012

просто используйте предложение OUTPUT (Transact-SQL) , и вы можете вставить данные и выбрать обратно все (даже несколько) идентификаторов в одном выражении:

INSERT INTO TEST (NAME) OUTPUT INSERTED.YourIdentity VALUES (@Name)

рабочий пример:

DECLARE @YourTable table (YourIdentity int identity(1,1) primary key, YourCol1 varchar(5))

INSERT INTO @YourTable (YourCol1) OUTPUT INSERTED.YourIdentity VALUES ('ABC')

ВЫХОД:

YourIdentity
------------
1

(1 row(s) affected)
...