开发者社区 问答 正文

如何从SQL Server中的链接服务器调用表值函数?

我想打电话给值函数从表Server02中Server01; Server01并且Server02是链接服务器。

RPC和RPC Out选项为true;

我写这个查询

SELECT *
FROM [Server02].[db].[dbo].[CalcAzarTrnForSevenSinFestival](19540675) 
CalcAzarTrnForSevenSinFestival 是一个表值函数 Server02

我得到这个错误

消息4122,级别16,状态1,第3行 不允许进行远程表值函数调用。

我搜索了这个问题,有人说NOLOCK您要在查询中添加选项

SELECT * 
FROM [Server02].[db].[dbo].[CalcAzarTrnForSevenSinFestival](19540675) (NOLOCK)

而我这个错误

消息195,级别15,状态15,第9行 'Server02.db.dbo.CalcAzarTrnForSevenSinFestival'不是公认的函数名称。

通常,我可以在SQL Server的链接服务器上调用表值函数吗?

展开
收起
心有灵_夕 2019-12-22 14:27:10 1124 分享 版权
阿里云 AI 助理回答

在SQL Server中,直接跨链接服务器调用表值函数(TVF)是受到限制的,这正是您遇到错误消息4122的原因。错误消息说明了“不允许进行远程表值函数调用”。尝试添加(NOLOCK)提示并不适用,因为该提示用于表的读取锁定行为,并不解决远程函数调用的问题,因此您收到了错误消息195,指出函数名称不被认可。

通常情况下,直接在链接服务器上执行表值函数是不可行的。但是,有几种变通方法可以实现类似的功能:

  1. OpenQuery: 您可以使用OPENQUERY来间接调用远程服务器上的表值函数。这种方式允许您执行一个传递到远程数据源的查询,并返回结果集。示例如下:

    SELECT *
    FROM OPENQUERY(Server02, 'SELECT * FROM db.dbo.CalcAzarTrnForSevenSinFestival(19540675)')
    

    这里,您将表值函数的调用作为字符串传递给OPENQUERY,这样SQL Server会将整个查询发送到远程服务器执行。

  2. 创建本地视图或表值函数代理: 在本地数据库中创建一个视图或者另一个表值函数,其内部使用OPENQUERY或其他分布式查询技术来调用远程的表值函数。这样,从本地数据库的角度看,就像是在操作本地对象一样。

  3. Linked Server Options调整: 虽然不太推荐且可能带来安全风险,但理论上可以通过修改链接服务器的属性来允许远程过程和表值函数调用。这通常涉及到更改“RPC Out”设置为TRUE,但请注意,对于表值函数,这个选项本身并不足以解决问题,且不建议为了此目的而改变它,因为它可能引入其他安全或性能问题。

请根据您的具体需求和环境选择合适的方法。最常用且推荐的方式是使用OPENQUERY,因为它既能够实现功能又保持了较好的安全性和兼容性。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答