2010-02-19 5 views
3

exec (@Sql)에 의해 삽입 된 삽입 된 레코드의 ID 값을 찾으려고 시도하지만 exec()가 다른 범위에서 실행하는 것처럼 보입니다.exec (@Sql)을 호출 한 후 ID 값을 얻는 방법

/* 
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을을 사용하여

답변

7

예 :

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 

[email protected] now contains the ID 

sp_executesql을의 장점은 당신이 다음 실행되는 문자열에 값을 concentenate하지 않아도 SQL 문이 실행되는 파라미터를 설정할 수 있습니다.

+0

, 감사합니다. – avenmore

0

동일한 문제가 있지만 대신 sp_executesql을 사용하여 외부에 가져 오려는 다른 데이터에도 사용할 수있는보다 고유 한 솔루션을 사용했습니다.

이 같은 호출 범위에 EXEC 내부에서 변수를 전달할 수 있습니다 : 그것은 잘 할 것

DECLARE @Result AS Table (Value int) 
INSERT INTO @Result EXEC('INSERT INTO MyTable(Fields) ''Value''; SELECT @@IDENTITY') 
SELECT Value FROM @Result 
관련 문제