我试图找到由 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/