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

Ian*_*oyd 13 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
Run Code Online (Sandbox Code Playgroud)

这不起作用,如PRB中所述:四部分链接服务器查询中的用户定义函数调用失败,错误消息170.他们还给出了一个解决方法:

例如,而不是以下查询

Select * from Linked_Server.northwind.dbo.square_value(10)
Run Code Online (Sandbox Code Playgroud)

使用Openquery函数运行查询:

Select * from Openquery(Linked_Server,'select northwind.dbo.square_ value(10)')
Run Code Online (Sandbox Code Playgroud)

如果用户定义的函数采用变量或标量参数,则可以使用sp_executesql存储过程来避免此行为.例如:

exec Linked_Server.northwind.dbo.sp_executesql N'SELECT northwind.dbo.square_value(@input)',N'@input int',@input=10
Run Code Online (Sandbox Code Playgroud)

我如何将这种解决方法应用于我的情况,以及这个人的情况?

换一种说法:

如何在链接服务器上调用UDF?

Pol*_*usB 5

要调用远程过程,您需要在链接服务器上激活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'
Run Code Online (Sandbox Code Playgroud)


小智 1

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
Run Code Online (Sandbox Code Playgroud)