多部分标识符无法与交叉应用绑定到具有 OPENQUERY 的链接服务器功能
Posted
技术标签:
【中文标题】多部分标识符无法与交叉应用绑定到具有 OPENQUERY 的链接服务器功能【英文标题】:Multipart identifier could not be bound with cross apply to linked server function with OPENQUERY 【发布时间】:2016-02-09 17:24:12 【问题描述】:我正在尝试通过不允许直接使用的链接服务器([linkedserver].[database].[dbo].fnGet()] 对函数进行远程调用,因此我必须使用 OPENQUERY 来执行那个函数调用。当我硬编码一个值作为我的函数参数时,这很好用,但我需要这个函数调用是动态的,并使用连接(通过 CROSS APPLY)表中的列。
SELECT
sc.FirstName
,sc.LastName
,sc.StudentId
,p.EnrollId
FROM
StudentClasses AS sc
CROSS APPLY
(
SELECT * FROM OPENQUERY
(
[LinkedServer],'SELECT database.dbo.fnGet(sc.StudentId) AS EnrollId'
)
)AS p
不幸的是,它一直说无法绑定多部分标识符“sc.StudentId”。
我找到了一些资源,这些资源显示了如何为本地函数调用更正此问题,但对于使用 OPENQUERY 的远程调用却没有。
任何帮助将不胜感激。
【问题讨论】:
【参考方案1】:您的 OPENQUERY 是在与当前会话不同的会话中传递给服务器的字符串。它对主查询中的StudentClasses AS sc
一无所知。您可以考虑到这一点进行重写(我对您的数据知之甚少,无法知道在您的情况下是否可行),或者您可以更改 OPENQUERY 以便将值传递到字符串中。这会很慢,但会奏效。
SELECT
sc.FirstName
,sc.LastName
,sc.StudentId
,p.EnrollId
FROM
StudentClasses AS sc
CROSS APPLY
(
SELECT * FROM OPENQUERY
(
[LinkedServer],'SELECT database.dbo.fnGet(' + Convert(varchar(11),sc.StudentId) + ') AS EnrollId'
)
)AS p
编辑:
您可以尝试的其他方法是同时避免 OPENQUERY
:
SELECT
sc.FirstName
,sc.LastName
,sc.StudentId
,p.EnrollId
,[LinkedServer].database.dbo.fnGet(sc.StudentId) AS EnrollId
FROM
StudentClasses AS sc
【讨论】:
如何从表的列 (StudentId) 中获取值以将其写入传递给 OPENQUERY 的字符串中?当我尝试您发布的示例代码时,它在尝试连接列值时以加号 (+) 终止 有时 SQL Server 不喜欢注入字符串时,这一定是其中之一。通常,当我访问链接服务器时,我不会使用OPENQUERY
来避免此类问题。你甚至不需要CROSS APPLY
。粗略地说,我从来没有用标量函数做到这一点,所以 SQL Server 可能也会在那里失败。 :-) 见编辑...
如我的 OP 中所述,我最初尝试了您在编辑中发布的内容。您不能直接通过链接服务器调用 UDF,因此需要 OPENQUERY。
乌格。我已经尝试了一切。我唯一能想到的就是遍历您的数据并创建/执行一些动态 SQL,其中包括 OPENQUERY。将每个结果放入一个 REAL 表中,然后在循环之后查询该表。丑陋但可能。以上是关于多部分标识符无法与交叉应用绑定到具有 OPENQUERY 的链接服务器功能的主要内容,如果未能解决你的问题,请参考以下文章