Database Programming: User-Defined Functions And Linked Server Connections

This post addresses an edge-case programming issue, but if you've ever run into into it, this may be a useful trick to have in your back pocket. This discussion applies to both SQL Server 2000 and SQL Server 2005; in SQL Server 2005, all databases involved must have SET TRUSTWORTHY ON run against them.

A colleague wished to call a user-defined function (UDF) housed on a linked server. SQL Server does not allow cross-server calls to a user-defined function, so this call..

SELECT

  String
FROM OPENQUERY(ServerX, 'SELECT String FROM MDPGJan031Issue.dbo.ExplodeSet(''MEDPSDEV'')')

.. produces an error message. The solution in this case is to place a stored procedure on ServerX that calls the UDF:

CREATE

PROCEDURE dbo.CallTheUDF
AS
SELECT  String
FROM dbo.ExplodeSet ('MEDPSDEV')

.. and then call the stored procedure over the linked server connection:

SELECT

String
FROM OPENQUERY(ServerX, 'EXEC MDPGJan031Issue.dbo.CallTheUDF')

This is a relatively simplistic example; you can also put the parameter to the UDF into a memory variable if you wish, which is certainly much more flexible.

     -wp