3

我正在尝试在链接服务器上获取 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_executesql 执行 sp_current_identity(我正在创建一个自定义 DataAapter 以通过 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”,但未提供该参数。

谢谢你的帮助!

4

2 回答 2

6

您是否考虑过运行EXEC remoteserver.database.dbo.sp_executesql 'dynamic SQL';而不是尝试在本地执行动态 SQL?sp_current_identity 过程必须存在于实际执行查询的位置,而不是调用查询的位置。

于 2011-08-01T20:52:39.637 回答
1

我发现我必须分两步组装对远程服务器的动态调用。我试图获取数据库 ID:

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 + ''''''

DECLARE @SPSQL nvarchar(4000) = '
    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
于 2013-12-16T14:19:04.723 回答