Sql server SQL Server:如何在链接服务器上调用用户定义函数(UDF)?

Sql server SQL Server:如何在链接服务器上调用用户定义函数(UDF)?,sql-server,sql-server-2000,linked-server,user-defined-functions,Sql Server,Sql Server 2000,Linked Server,User Defined Functions,我正在尝试调用链接服务器上的用户定义函数(UDF): CREATE FUNCTION [dbo].[UserGroupMembershipNames](@UserGUID uniqueidentifier) RETURNS VARCHAR(8000) AS BEGIN RETURN ASILIVE.ReportManager.dbo.UserGroupMembershipNames(@UserGUID) END 这不起作用,如中所述。它们还提供了一种解决方法: 例如,而不是下面的查

我正在尝试调用链接服务器上的用户定义函数(UDF):

CREATE FUNCTION [dbo].[UserGroupMembershipNames](@UserGUID uniqueidentifier)  
RETURNS VARCHAR(8000)
AS
BEGIN
    RETURN ASILIVE.ReportManager.dbo.UserGroupMembershipNames(@UserGUID)
END
这不起作用,如中所述。它们还提供了一种解决方法:

例如,而不是下面的查询

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?要调用远程过程,需要在链接服务器上激活RPC OUT。在SSMS中打开链接服务器的属性,然后单击“服务器选项”,并确保RPC Out为True

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
而且。。。 您的链接提供了问题的解决方案。查看解决方案中的最后一个选项

“exec Linked_Server.northwind.dbo.sp_executesql N'SELECT northwind.dbo.square_值(@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 [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

这不是最漂亮的解决方案,但如果您能够将参数传递到链接服务器函数中,它就会起作用

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 

请尝试一下这个,我想这将在SQLServer2005上运行


[LINKED_SERVER_name]

上的exec('SELECT[dbname].dbo.function_name()')不起作用。Msg 558,16级,状态2,第1行远程函数调用在函数中是不允许的。@Keith,是的,我也这么想。它不能工作。。。他是如何在函数中运行存储过程的???我发现它非常漂亮!