Как получить значение идентификатора после вызова exec (@Sql) - PullRequest
3 голосов
/ 19 февраля 2010

Я пытаюсь найти значение идентификатора вставленной записи, вставленной 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 ()?

Ответы [ 2 ]

7 голосов
/ 19 февраля 2010

да, используя 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, поэтому вам не нужно добавлять значения в строку для последующего выполнения.

0 голосов
/ 29 апреля 2014

У меня была та же проблема, но вместо использования sp_executesql я использовал более нативное решение, которое также работает с другими данными, которые вы хотите вывести наружу.

Вы можете передавать переменные изнутри EXEC в область вызова следующим образом:

DECLARE @Result AS Table (Value int)
INSERT INTO @Result EXEC('INSERT INTO MyTable(Fields) ''Value''; SELECT @@IDENTITY')
SELECT Value FROM @Result
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...