我有一个包含一组参数的查询,需要使用不同的参数多次运行,因此我将其包装在表值函数中。
该表值函数需要从远程服务器调用。不幸的是,调用在链接服务器上失败并出现错误:
Msg 4122, Level 16, State 1, Line 29
Remote table-valued function calls are not allowed.
Microsoft 承认“远程调用表值函数”是 SQL Server 2008 中未包含的功能。请参阅:http://connect.microsoft.com/SQLServer/feedback/details/276758/remote-table-valued-function-calls-are-not-allowed
我发现了一种使用 OPENQUERY 语法的解决方法,它允许查询在远程服务器上本地运行,然后返回结果集。看:http://social.msdn.microsoft.com/Forums/en/transactsql/thread/7a6e4aa1-630b-4ad5-aee5-15139987adbd
不幸的是,这个解决方法需要一个解决方法,因为它需要一个字符串作为参数,这意味着您不能使用 OPENQUERY 语法传递变量,甚至不能在其中连接字符串,就像如果您想包含您想要的变量一样想要传递给远程表值函数。解决方法是使用动态 SQL 显式构建 OPENQUERY 查询,确保将正常字符串传递给它。看:http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/0847ad24-0dfe-4ae1-9788-5516c7830f40/
然而,由此产生了另一个问题。即使在确保所有引号、双引号和四引号都正确嵌入以便整个内容可以通过 exec sp_executesql 传递之后,仍然存在问题:
当查询最终调用表值函数时,我收到错误:
OLE DB provider "SQLNCLI10" for linked server "MY_REMOTE_SERVER_NAME" returned message "Deferred prepare could not be completed.".
Msg 7416, Level 16, State 1, Procedure MyTableValuedFunctionName, Line 22
Access to the remote server is denied because no login-mapping exists.
我不确定为什么会收到此错误,因为我的用户名存在映射,如果我只是将表值函数替换为实际表,它会正常返回结果。无论是否使用 sp_executesql 执行,OPENQUERY 语句都会出现问题,正如我所说,它仅在调用表值函数时出现。
有什么想法如何解决这个问题吗?