在加入之前过滤以避免“多部分标识符无法绑定”错误

时间:2013-06-01 05:14:58

标签: sql-server-2008 ssis

我正在使用SQL Server 2008并尝试在SSIS包数据流任务中编写查询,以根据另一个数据库的结果集从一个数据库中读取数据。

我有多个表A,B,C,D,E等,我正在尝试编写一个连接这些表并在过滤器后获取数据的选择。我得到一个"多部分标识符无法绑定"以下查询错误

SELECT
A.1 as A1,

A.2 as A2,

A.3 as A3,

B.1 as B1,

(Select C.1 from C 

        left join cc on c.2 = cc.2

        where C.x = A.x) as C1,

(Select D.1 from D where D.x = A.x) as D1,

E.4 as E4

FROM A

 left join B on B.Y = A.Y

 inner join C on C.Y = A.Y

 inner join D on D.Y = C.X

 left join E on E.Y = D.Z AND E.Z = 'ZZZZ'

WHERE A.P = ?

查询的一般结构如上所述,如果我完全删除where子句或给出一个简单的"WHERE A.P = 'PPPP'",查询运行正常。它看起来很简单,我没有使用where子句中的子查询中的任何数据。我究竟做错了什么?

1 个答案:

答案 0 :(得分:0)

此错误表示引用无法绑定到对象。但是,它不是指表达式的列部分,而是指之前的部分。

因此,如果P不是A中的列,那么A.P将生成类似“未找到列”的错误。如果A子句中未定义from,则A.P将为您提供“多部分标识符未找到错误”。

一个常见的原因是滥用别名。如果你有这样的代码:

from TableA a
where TableA.col . . .

然后你会得到错误。虽然TableA子句中包含from,但查询中的别名A而不是表名称。这也可能发生,因为您在表达式中输入了表名,模式名,数据库名或服务器名。