9

Estoy intentando llamar a una función definida por el usuario (UDF) en un servidor vinculado:Servidor SQL: ¿Cómo llamar a una función definida por el usuario (UDF) en el servidor vinculado?

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

Esto no funciona, como se documenta en PRB: User-Defined Function Call in Four-Part Linked Server Query Fails with Error Message 170. También dan una solución:

Por ejemplo, en lugar de la siguiente consulta

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

ejecutar una consulta con la función openquery:

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

Si la función definida por el usuario toma la variable o parámetros escalares, puede usar el procedimiento almacenado sp_executesql para evitar este comportamiento. Por ejemplo:

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

¿cómo iba a aplicar esta solución a mi situación, y la situación de this guy?

En otras palabras:

cómo llamar a una UDF en un servidor vinculado?

Respuesta

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

para llamar a procedimientos remotos, es necesario activar RPC OUT del servidor vinculado. Abra las Propiedades del Servidor Vinculado en SSMS luego haga clic en "Opción de Servidor" y asegúrese de que RPC Out sea Verdadero.

Y ... Tu enlace tiene la solución a tu problema. Mira la última opción en la solución

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

Aquí es un caso de prueba para usted:

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

comprobar este acoplamiento, que es mi blog:

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

Los detalles simples del enlace de arriba es la siguiente función.

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

Gracias por publicar su respuesta! Asegúrese de leer detenidamente [Preguntas frecuentes sobre autopromoción] (http://stackoverflow.com/faq#promotion). También tenga en cuenta que * se requiere * que publique un descargo de responsabilidad cada vez que se vincula a su propio sitio/producto. He agregado el descargo de responsabilidad requerido en esta publicación. Por favor, no lo olvides en el futuro. –

+1

En realidad, soy un usuario nuevo y tengo un problema de duplicación de cuenta inicialmente. Gracias por su sugerencia, me ocuparé de esto en el futuro. –

+1

no funciona.Msg 558, nivel 16, estado 2, línea 1 Las llamadas a funciones remotas no están permitidas dentro de una función. – Keith

0
No

la solución más bonita pero funciona si se puede evitar paso de parámetros en la función de servidor vinculado

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 
Cuestiones relacionadas