2016-08-10 9 views
1

現在のサーバーにリンクされているサーバーに関数があります。この機能はローカルサーバーにも存在しますが、正確なコピーを保持するには、2つの場所に変更を展開する必要があります(理想的ではありません)。SQL Server 2012 - 動的クエリを関数内部で実行する(またはリンクされたサーバー間でexec関数を実行する)

1.リンク先サーバーまたは の間で関数を実行します。2.以下の関数が正しく実行できるように動的SQLクエリを実行しますか?関数は、あなたがそうのような関数定義を格納するためのビューを作成することができますが存在するローカルサーバー上で

Create Function [dbo].[Build_HH_Key] (@lastname varchar(60),@address varchar(150), @zip varchar(10)) 
returns varchar(30) 
as 
Begin 

    Declare @out_var as varchar(30) 
    Declare @innerSQL as varchar(1000) = 'select out_var = [MyDatabase].[dbo].[Build_HH_Key]('[email protected]+','[email protected]+','[email protected]+')' 
    Declare @sql as varchar(1000) = 'select @out_var = out_var from openquery([MyServer],'' '+ @innersql +' '')' 

    Declare @Return as varchar(30) 
    exec sp_executesql @sql, N'@out_var varchar(30) OUTPUT', @Return = @out_var output; 

    Return @Return; 

End 
+0

そうですか? http://stackoverflow.com/questions/4125820/sql-server-how-to-call-a-user-defined-function-udf-on-linked-server – scsimon

+0

@scsimon - 私はこの質問を先に見て、男のリンク。コメントは、SQL Server 2005を使用していて、2008年以降にエラーが発生したときにバージョン管理エラーが発生する可能性を指摘していました。 – rdbradshaw

答えて

0

もちろんあなたが引くことができ

SELECT sm.object_id, 
    OBJECT_NAME(sm.object_id) AS object_name,  
    sm.definition 
FROM Server.Database.sys.sql_modules AS sm 
WHERE sm.object_id = OBJECT_ID('dbo.ufn_myTestFN') 

としてビューmyFunctionDefinition作成ALL機能を使用して、次のパートで必要な機能を制限します。

次に、リンクされたサーバー上でその機能の定義(コード)を取り込むジョブを作成し、データベースの現在のバージョンをビュー内のものと変更することができます。

declare @fn varchar max 
set @fn = select definition from Server.Database.dbo.myFunctionDefinition 
set @fn = replace(@fn,'create','alter') 
sp_execute @fn 
関連する問題