Получение ИДЕНТИЧНОСТИ от динамического ВСТАВКИ - PullRequest
4 голосов
/ 19 апреля 2011

В хранимой процедуре я динамически создаю запрос с помощью INSERT. Это делается для того, чтобы принудительно установить значения по умолчанию (например, с @name, если оно равно NULL).

SET @sql = 'INSERT INTO table (username, password'
    + CASE @name IS NULL THEN '' ELSE ',name' END
    + ') VALUES (''root'',''gelehallon''' +
    + CASE @name IS NULL THEN '' ELSE ',''@name''' END
    + ')'
EXEC sp_executesql @sql

SET @id = SCOPE_IDENTITY()

@ id будет 0 независимо от того,
Как я могу безопасно получить IDENTITY, даже если другой поток выполняет ту же хранимую процедуру одновременно?

Ответы [ 2 ]

10 голосов
/ 19 апреля 2011
SET @sql = 'INSERT INTO table (username, password) VALUES (@username,@pwd) 
    SELECT @id = SCOPE_IDENTITY()'
EXEC sp_executesql @sql, 
    N'@username VARCHAR(50), @pwd VARCHAR(50), @id INTEGER OUTPUT', 
    'root', 'gelehallon', @id OUTPUT

-- @id now has SCOPE_IDENTITY() value in

Хотя несколько моментов:
- если предположить, что это упрощенный пример, так как в этом примере нет необходимости использовать динамический SQL
- при условии, что вы не собираетесь хранить реальные пароли в виде простого текста в БД!

1 голос
/ 19 апреля 2011

Либо вы можете использовать предложение OUTPUT с оператором INSERT.Это заставит динамический оператор и, следовательно, системную хранимую процедуру, использованную для его вызова, вернуть набор строк (одна строка в вашем случае).Вы можете воспользоваться случаем и вставить набор строк в табличную переменную, а затем прочитать значение.

В принципе это может выглядеть так:

SET @sql = 'INSERT INTO table (...) OUTPUT inserted.ID VALUES (...)';
DECLARE @ScopeIdentity (ID int);
INSERT INTO @ScopeIdentity
  EXEC sp_executesql @sql;
SELECT @id = ID FROM @ScopeIdentity;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...