リンクサーバーでユーザー定義関数(UDF)を呼び出そうとしています。
CREATE FUNCTION [dbo].[UserGroupMembershipNames](@UserGUID uniqueidentifier)
RETURNS VARCHAR(8000)
AS
BEGIN
RETURN ASILIVE.ReportManager.dbo.UserGroupMembershipNames(@UserGUID)
END
PRB:4部構成のリンクサーバークエリでのユーザー定義関数呼び出しがエラーメッセージ170で失敗する で説明されているように、これは機能しません。彼らはまた回避策を提供します:
たとえば、次のクエリの代わりに
Select * from Linked_Server.northwind.dbo.square_value(10)
openquery関数でクエリを実行します。
Select * from Openquery(Linked_Server,'select northwind.dbo.square_ value(10)')
ユーザー定義関数が変数またはスカラーパラメーターを取る場合は、sp_executesqlストアドプロシージャを使用してこの動作を回避できます。例えば:
exec Linked_Server.northwind.dbo.sp_executesql N'SELECT northwind.dbo.square_value(@input)',N'@input int',@input=10
この回避策を自分の状況と this guy の状況にどのように適用しますか?
言い換えると:
リンクサーバーでUDFを呼び出す方法
リモートプロシージャを呼び出すには、リンクサーバーでRPC OUTをアクティブにする必要があります。 SSMSでリンクサーバーのプロパティを開き、[サーバーオプション]をクリックして、RPC OutがTrueであることを確認します。
そして...あなたのリンクはあなたの問題の解決策を持っています。回避策の最後のオプションを見てください
"exec Linked_Server.northwind.dbo.sp_executesql N'SELECT northwind.dbo.square_value(@input) '、N' @ input int '、@ input = 10"
ここにあなたのためのテストケースがあります:
use master
go
EXEC master.dbo.sp_addlinkedserver @server = N'(LOCAL)', @srvproduct=N'SQL Server';
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'(LOCAL)',@useself=N'True',@locallogin=NULL,@rmtuser=NULL,@rmtpassword=NULL;
EXEC master.dbo.sp_serveroption @server=N'(LOCAL)', @optname=N'rpc out', @optvalue=N'true'
GO
Use Testing
GO
CREATE FUNCTION [dbo].[UserGroupMembershipNames](@UserGUID uniqueidentifier)
RETURNS VARCHAR(8000)
AS
BEGIN
RETURN 'hello'
END
GO
select dbo.[UserGroupMembershipNames]('4278E0BF-2F7A-4D60-A09C-95E517E21EBC')
GO
exec [(LOCAL)].Testing.dbo.sp_executesql
N'select dbo.UserGroupMembershipNames(@UserGUID)',N'@UserGUID uniqueidentifier'
,@UserGUID='4278E0BF-2F7A-4D60-A09C-95E517E21EBC'
きれいなソリューションではありませんが、リンクサーバー関数にパラメーターを渡すことで回避できる場合は機能します
CREATE FUNCTION fn_LocalFunction
(
@SomeParamOfLinkedFunction VARCHAR(100)
)
RETURNS TABLE
AS
RETURN
SELECT SomeField
FROM OPENQUERY([YOURSERVER], 'SELECT * FROM [SOMEDB].dbo.fn_SomeRemoteFunction(NULL)') tst
WHERE SomeCondition = @SomeParamOfLinkedFunction
このリンクをチェック、これは私のブログです:
http://developersmania.blogspot.com/2012/11/call-user-defined-function-on-linked.html
上記のリンクの簡単な詳細は、以下の関数です。
CREATE FUNCTION [dbo].Function_Name(@Parameter INT)
RETURNS VARCHAR(8000)
AS
BEGIN
DECLARE @Word sysname
EXEC LinkedServer.DatabaseName.dbo.sp_executesql
N'SELECT DatabaseName.dbo.Function_Name(@Parameter)' --dynamic sql query to execute
,N'@Parameter int' --parameter definitions
,@Parameter=@Word OUTPUT --assigning the caller procs local variable to the dynamic parameter
RETURN @Word
END
Try the following changes:
CREATE FUNCTION [dbo].[UserGroupMembershipNames](@UserGUID uniqueidentifier)
RETURNS VARCHAR(8000)
AS
BEGIN
declare @sql nvarchar(800)
declare @param nvarchar(20)
declare @innersql nvarchar(400)
set @param = convert(char(20, @UserGUID )
set @innersql = 'select ReportManager.dbo.UserGroupMembershipNames('+@param+')'
set @sql = 'select * from openquery(ASILIVE,'' '+ @innersql +' '' )'
RETURN exec sp_executesql @sql
END