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の2つの同義語を作成しました。

sp_executesqlを使用してsp_current_identityを実行する必要があります(LLBLGEN 3.1を介して同義語を操作するカスタムDataAtapterを作成しています)。次の例を参照してください。

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

リモート サーバーへの動的呼び出しを 2 つの手順で組み立てる必要があることがわかりました。データベース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 に答える