我正在尝试在链接服务器上调用用户定义函数(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的情况?
换句话说:
如何在链接服务器上调用UDF?
答案 0 :(得分: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'
答案 1 :(得分:1)
选中此链接,这是我的博客:
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
答案 2 :(得分:1)
不是最漂亮的解决方案,但如果你可以解决将参数传递到链接服务器函数
的问题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
答案 3 :(得分: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('+@param+')'
set @sql = 'select * from openquery(ASILIVE,'' '+ @innersql +' '' )'
RETURN exec sp_executesql @sql
END
答案 4 :(得分:-1)
请试一试,我认为这将适用于 SQL Server 2005 及以上
exec ('SELECT [dbname].dbo.function_name()') AT [LINKED_SERVER_NAME]