9

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

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

Это не работает, как описано в PRB: User-Defined Function Call in Four-Part Linked Server Query Fails with Error Message 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?

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

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

ответ

0
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('[email protected]+')' 
    set @sql = 'select * from openquery(ASILIVE,'' '+ @innersql +' '')' 
    RETURN exec sp_executesql @sql 
END 
1

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

И ... У вашей связи есть решение проблемы. Посмотрите на последний вариант в обходном пути

«EXEC Linked_Server.northwind.dbo.sp_executesql N'SELECT northwind.dbo.square_value (@input)», N '@ ввод Int', @ вход = 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' 
2

Проверить эту ссылку, это мой блог:

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 
     ,@[email protected] OUTPUT --assigning the caller procs local variable to the dynamic parameter 

    RETURN @word 

END 
+1

Спасибо за размещение ответа! Обязательно внимательно прочитайте [FAQ по самопомощи] (http://stackoverflow.com/faq#promotion). Также обратите внимание, что * требуется *, что вы публикуете отказ от ответственности каждый раз, когда вы ссылаетесь на свой собственный сайт/продукт. Я добавил в обязательный отказ от ответственности на этом посту. Пожалуйста, не забудьте в будущем. –

+1

На самом деле я новый пользователь и проблема с дублированием учетной записи. Спасибо за ваше предложение, я позабочусь об этом в будущем. –

+1

не работает.Msg 558, уровень 16, состояние 2, строка 1 Удаленные вызовы функций не допускаются внутри функции. – Keith

0

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

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 
Смежные вопросы