sql-server - 调用exec(@Sql)后如何获取标识值

标签 sql-server tsql identity

我试图找到由 exec(@Sql) 插入的插入记录的标识值,但似乎 exec() 在不同的范围内执行。

/*
create table [dbo].[__Test](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [description] [varchar](100) NULL
) ON [PRIMARY]
GO
*/

declare @Sql varchar(512)
set @Sql = 'insert into [dbo].[__Test] ([description]) values (''Some text'')'
exec (@Sql)

select
    @@IDENTITY as [@@IDENTITY],
    scope_identity() as [scope_identity],
    ident_current('__Test') as [ident_current]

/*  
if exists(select * from sys.objects where object_id = object_id('[dbo].[__Test]') and type='U')
    drop table [dbo].[__Test]
GO
*/

返回:
@@IDENTITY  scope_identity  ident_current
----------  --------------  -------------
14          NULL            14

如果 __Test 上有触发器,则返回:
@@IDENTITY  scope_identity  ident_current
----------  --------------  -------------
6           NULL            14

所以@@IDENTITY 可能是触发器插入,执行不在范围内,而 ident_current() 可能来自另一个用户。

有没有办法可靠地从 exec() 所做的插入中找到标识值?

最佳答案

是的,通过使用 sp_executesql:

DECLARE @nSQL NVARCHAR(500)
DECLARE @NewID INTEGER

SET @nSQL = 'INSERT MyTable (MyField) VALUES (123) SELECT @NewID = SCOPE_IDENTITY()'
EXECUTE sp_executesql @nSQL, N'@NewID INTEGER OUTPUT', @NewId OUTPUT

--@NewId now contains the ID

sp_executesql 的优点是您可以参数化正在执行的 SQL 语句,因此您不必将值集中到一个字符串中然后执行。

关于sql-server - 调用exec(@Sql)后如何获取标识值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2296627/

相关文章:

c# - 如何欺骗更新身份列?

sql - 数据库项目可以使用 machine.config 连接字符串进行部署吗?

sql-server - 如果使用 Power BI,还需要 SQL Server Analysis Services 吗?

sql - 如何使用 T-SQL 获取在主键字段中生成的最后一个值

sql - SQL中如何获取子组的计数

xslt - 优化<xsl :apply-templates/> for a set of tags

ruby - 使用 Ruby 连接到 MSSQL 数据库

sql-server - 有没有办法在 SQL Server 2008 中直观地显示数据库图表中的 View ?

sql - 如何从每组中选择前 5%?

identity - 在 Visual Studio 2013 中拥有身份