sql-server-2005 - 从动态 INSERT 获取 IDENTITY

标签 sql-server-2005 tsql

在存储过程中,我使用 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?

最佳答案

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

关于sql-server-2005 - 从动态 INSERT 获取 IDENTITY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5713358/

相关文章:

sql-server - 如何监控更新表统计信息的成本?

sql - 另一个将行转列的问题 - SQL Server 2005

sql-server - 将 xml 列值包装到外部以进行 xml 路径查询

asp.net - SQL Server 2005 网络 IO 等待时间(ASYNC_NETWORK_IO 等待类型)问题

sql - 合并查询结果中的记录

sql-server - 比较日期 < 或 DateDiff 哪个更好?

c# - 最后 Activity 日期 - 更好的实现想法

sql - 我如何选择日期时间作为 ddMMyy,即两位数的年份?

sql-server - 在哪里可以找到列数据类型的 Sql Server 元数据?

tsql - T-SQL 将十六进制转换为十进制