wake-up-neo.com

SQL Server: Aufrufen einer benutzerdefinierten Funktion (UDF) auf einem Verbindungsserver

ich versuche, eine benutzerdefinierte Funktion (UDF) auf einem Verbindungsserver aufzurufen:

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

Dies funktioniert nicht, wie in PRB dokumentiert: Benutzerdefinierter Funktionsaufruf in einer vierteiligen Abfrage für verknüpfte Server schlägt mit der Fehlermeldung 170 fehl. Sie geben auch eine Problemumgehung:

Zum Beispiel anstelle der folgenden Abfrage

Select * from Linked_Server.northwind.dbo.square_value(10)

führen Sie eine Abfrage mit der Openquery-Funktion aus:

Select * from Openquery(Linked_Server,'select northwind.dbo.square_ value(10)')

Wenn die benutzerdefinierte Funktion variable oder skalare Parameter akzeptiert, können Sie die gespeicherte Prozedur sp_executesql verwenden, um dieses Verhalten zu vermeiden. Zum Beispiel:

exec Linked_Server.northwind.dbo.sp_executesql N'SELECT northwind.dbo.square_value(@input)',N'@input int',@input=10

Wie würde ich diese Problemumgehung auf meine Situation und die Situation von diesem Kerl anwenden?

Mit anderen Worten:

Wie rufe ich eine UDF auf einem Verbindungsserver auf?

11
Ian Boyd

Um Remoteprozeduren aufzurufen, müssen Sie RPC OUT auf Ihrem Linked Server aktivieren. Öffnen Sie die Eigenschaften des Linked Servers in SSMS, klicken Sie dann auf "Server Option" und stellen Sie sicher, dass RPC Out True ist.

Und ... Ihr Link hat die Lösung für Ihr Problem. Sehen Sie sich die letzte Option im WorkAround an 

"exec Linked_Server.northwind.dbo.sp_executesql N'SELECT northwind.dbo.square_value (@input) ', N' @ input int ', @ input = 10"

Hier ist ein Testfall für Sie:

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'
3
PollusB

Nicht die schönste Lösung, aber sie funktioniert, wenn Sie die Parameterübergabe an die Linked-Server-Funktion umgehen können

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
Denis

Check This Link, das ist mein Blog :

http://developersmania.blogspot.com/2012/11/call-user-defined-function-on-linked.html

Einfache Details des obigen Links sind die Funktion unten.

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
Sheikh M. Haris
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
0
Amy A