如何从链接服务器调用Scalar用户定义的函数?

时间:2015-04-20 15:28:51

标签: sql sql-server sql-server-2008 tsql linked-server

我必须在该服务器上运行包含Scalar UDF(带有一个参数)的链接服务器(SQL Server 2008)的查询,当我运行查询时出现以下错误

Cannot find either column "PSW_Local" or the user-defined function or aggregate "PSW_Local.dbo.udf_psw_local_format_name", or the name is ambiguous.

我使用OPEN Query在互联网上关注了某人的建议,但它无效。

有人可以提出不同的方法吗? 提前致谢

3 个答案:

答案 0 :(得分:4)

要引用链接服务器,您必须对要在链接服务器上引用的对象使用4部分命名。

这是由[SERVER_NAME]。[DATABASE_NAME]。[SCHEMA_NAME]。[OBJECT_NAME]

组成的

这是一篇很好的小文章,可以解释它 - http://www.mssqltips.com/sqlservertip/1095/sql-server-four-part-naming/

确保SERVER_NAME是本地计算机上为服务器指定的名称。 (我假设已经测试了与链接服务器的连接。)

要在链接服务器上引用功能,您确实需要使用OPENQUERY。代码看起来像这样:

SELECT * FROM OPENQUERY([LINKED_SERVER_NAME],'SELECT [DATABASE_NAME].[SCHEMA_NAME].FUNCTION_NAME()')

请注意,如果您使用字符串作为函数的参数,则需要对其进行双引号。

答案 1 :(得分:0)

OpenQuery功能有效:

SELECT * FROM OPENQUERY([myservername\yyySQL2008R2], 
    'SELECT mydb.dbo.ElapsedWorkDays(''1/1/2017'',GETDATE()) ' );

我测试了这个并且语法有效。

答案 2 :(得分:0)

如果你需要传入参数并返回一个值,那么你可以使用这样的东西;

DECLARE @Arg1 INT = 1234;
DECLARE @Arg2 VARCHAR(15) = 'ABCD';
DECLARE @ReturnValue INT;
DECLARE @Parameters NVARCHAR(255) = '@ReturnValue INT OUTPUT'


DECLARE @Command NVARCHAR(MAX) = 
    N'SELECT @ReturnValue = [ReturnValue] FROM OPENQUERY(
        [LINKED_SERVER]
        , ''SELECT [Database].[schema].[ScalarValuedFunction](' + CAST(@Arg1 AS VARCHAR(255)) + ', ''''' + @Arg2 + ''''') ReturnValue''
        )'

PRINT @Command

EXEC sys.sp_executesql 
    @Command, @Parameters, @ReturnValue=@ReturnValue OUTPUT

SELECT @ReturnValue [ReturnValue]