SQL Server: как вызвать пользовательскую функцию (UDF) на связанном сервере? - PullRequest
13 голосов
/ 08 ноября 2010

Я пытаюсь вызвать пользовательскую функцию (UDF) на связанном сервере:

CREATE FUNCTION [dbo].[UserGroupMembershipNames](@UserGUID uniqueidentifier)  
RETURNS VARCHAR(8000)
AS
BEGIN
    RETURN ASILIVE.ReportManager.dbo.UserGroupMembershipNames(@UserGUID)
END

Это не работает, как описано в PRB: вызов пользовательской функциив четырехчастном запросе связанного сервера завершается ошибкой с сообщением об ошибке 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

Как бы я применил этот обходной путь к моей ситуации и ситуации этого парня ?

Другими словами:

Как вызвать UDF на связанном сервере?

Ответы [ 4 ]

5 голосов
/ 10 октября 2012

Для вызова удаленных процедур вам необходимо активировать RPC OUT на вашем связанном сервере. Откройте Свойства связанного сервера в SSMS, затем нажмите «Опции сервера» и убедитесь, что RPC Out установлен в True.

И ... Ваша ссылка имеет решение вашей проблемы. Посмотрите на последний вариант в WorkAround

"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'
1 голос
/ 29 марта 2017

Не самое симпатичное решение, но оно работает, если вы можете обойти передачу параметров в функцию связанного сервера

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 
1 голос
/ 29 ноября 2012

Отметьте эту ссылку, которая является моим блогом :

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
0 голосов
/ 10 сентября 2012
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
...