多部分标识符无法与交叉应用绑定到具有 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 的链接服务器功能的主要内容,如果未能解决你的问题,请参考以下文章

SQL 错误 无法绑定多部分标识符

协助 SQL 查询 - 无法绑定多部分标识符

无法绑定多部分标识符“alias.field”

多部分标识符无法绑定更新列

SQL 错误:无法绑定多部分标识符

无法绑定多部分标识符“p.ProductID”