Выполнение удаленной хранимой процедуры в sp_executesql - PullRequest
2 голосов
/ 02 августа 2011

Я пытаюсь получить значение IDENT_CURRENT на связанном сервере. Я создал хранимую процедуру sp_current_identity на удаленном сервере с выходным параметром.

CREATE  PROCEDURE [dbo].[sp_current_identity] ( @strTableName nvarchar(255), @intRowId int OUTPUT )
AS
BEGIN
select IDENT_CURRENT(@strTableName)
END

После этого я создал два синонима: sp_current_identity и sometable.

Мне нужно выполнить sp_current_identity, используя sp_executesql (я создаю собственный DataAtapter для работы с синонимами через LLBLGEN 3.1). Пожалуйста, смотрите следующий пример:

declare @p4 int
set @p4=NULL
exec sp_executesql N'SET XACT_ABORT ON; INSERT INTO [db].[dbo].[sometable] ([FieldName], [TableName], [UserField]) VALUES (@p1, @p3, @p4) ;
exec dbo.sp_current_identity @p5, @p2 
;SET XACT_ABORT OFF',N'@p1 varchar(50),@p2 int output,@p3 varchar(50),@p4 varchar(50), @p5 varchar(200)',
@p1='test24',@p2=@p4 output,@p3='test24',@p4='test5',@p5='sometable'
select @p4

Хорошо работает, когда этот код выполняется на удаленном сервере (где sp_current_identity - локальная хранимая процедура), но вызывает исключение, когда код выполняется на локальном сервере. Вот ошибка:

Процедура или функция 'sp_current_identity' ожидает параметр '@strTableName', который не был предоставлен.

Спасибо за вашу помощь!

Ответы [ 2 ]

4 голосов
/ 02 августа 2011

Рассматривали ли вы запуск EXEC remoteserver.database.dbo.sp_executesql 'dynamic SQL'; вместо попытки выполнить динамический SQL локально? Процедура sp_current_identity должна существовать в том месте, где фактически выполняется запрос, а не там, где запрос вызывается.

0 голосов
/ 16 декабря 2013

Я обнаружил, что мне нужно собрать динамический вызов на удаленном сервере в два этапа.Я пытался получить идентификатор базы данных:

DECLARE @sql nvarchar(4000)
DECLARE @ParmDefinition nvarchar(500)
SET @ParmDefinition = N'@retvalOUTside int OUTPUT' 
SET @sql = 'SELECT TOP 1 @retvalOUT = database_id FROM [' + @ServerName + '].master.sys.databases WHERE name = ''''' + @dbname + ''''''
SET @SPSQL = '
DECLARE @DBID INT;
DECLARE @ParmDefinition nvarchar(500); 
SET @ParmDefinition = N''@retvalOUT int OUTPUT''; 
DECLARE @SQLinside nvarchar(400) =''' + @sql + ''';
EXEC  [' + @ServerName + '].master.dbo' + '.sp_executeSQL @SQLinside, @ParmDefinition, @retvalOUT = @retvalOUTside OUTPUT'
EXEC sp_executeSQL @SPSQL, @ParmDefinition, @retvalOUTside=@dbid OUTPUT
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...