从动态INSERT获取IDENTITY

时间:2011-04-19 08:04:21

标签: sql-server-2005 tsql

在存储过程中,我使用INSERT动态创建查询。这样做是为了强制默认值(如果它是NULL,则与@name一样)。

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 个答案:

答案 0 :(得分:10)

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 - 假设您不打算在db中以纯文本形式存储真实密码!

答案 1 :(得分:1)

或者,您可以将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;