什么是“多部分标识符”? 为什么它不能被绑定?

当我尝试根据另一个表更新表时,我不断地得到这些错误。我最终重写了查询,改变了连接的顺序,改变了一些分组,然后它终于工作了,但我就是不太明白。

什么是“多部分标识符”?
什么时候“多部分标识符”无法绑定?
它到底被绑定到什么地方了?
在什么情况下会发生这种错误?
最好的预防方法是什么?

SQLServer2005中的具体错误是:

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

这里有一个例子:

UPDATE  [test].[dbo].[CompanyDetail]


SET Mnemonic = [dbBWKMigration].[dbo].[Company].[MNEMONIC],
[Company Code] = [dbBWKMigration].[dbo].[Company].[COMPANYCODE]


WHERE [Company Name] = **[dbBWKMigration].[dbo].[Company].[COMPANYNAME]**

实际的错误是:

Msg 4104,16级,状态1,行3多部分标识符 无法绑定“ dbBWKMigation.dbo.Company.COMPanyNAME”。

518858 次浏览

Binding = 将特定列的文本表示映射到某个表中、某个数据库中、某个服务器上的物理列。

Multipart 标识符可以是: MyDatabase.dbo.MyTable。如果您错误地使用了这些标识符中的任何一个,那么您就拥有了一个无法映射的多部分标识符。

避免这种情况的最好方法是第一次就正确地编写查询,或者使用管理工作室的插件来提供智能感知,从而避免输入错误。

多部分标识符是包含多个部分(例如 MyTable)的字段或表的任何描述。SomRow ——如果它不能被绑定,那就意味着它有问题——要么是简单的输入错误,要么是表和列之间的混淆。也可能是在表或字段名中使用保留字而没有用[]包围它们造成的。 也可能是由于没有包含目标表中所需的所有列造成的。

Redgate sql 提示符这样的工具非常聪明,它可以避免手动输入这些内容(它甚至可以根据外键自动完成连接) ,但它并不是免费的。SQL server 2008支持开箱即用的智能感知,尽管它不像 redgate 版本那样完整。

你可能打错字了。例如,如果在名为 Sales 的数据库中有一个名为 Customer 的表,则可以将其称为 Sales。.Customer (尽管最好包含所有者名称(dbo 是默认所有者)来引用它,如 Sales.dbo。顾客。

如果你输入“销售... ... 客户”,你可能已经得到了你得到的信息。

可能是打错了。在代码中查找调用[ schema ]的位置。[ TableName ](基本上任何引用字段的地方) ,并确保所有内容都拼写正确。

就我个人而言,我会尽量避免这种情况,在我所有的桌子上都使用别名。当您可以将一个长表名缩短为描述的首字母缩略词(即 WorkOrderPart-> WOP)时,它将大有帮助,并且还可以使您的查询更具可读性。

编辑: 作为一个额外的好处,当您只需要输入一个三个或四个字母的别名,而模式、表和字段名都在一起时,您将节省大量的击键次数。

如果确定它不是拼写错误,那么它可能是拼写错误。

你用的是什么排序法? 检查一下。

我发现当我尝试缩写的时候,我经常遇到这样的情况,比如:

Table1 t1, Table2 t2
where t1.ID = t2.ID

改成:

Table1, Table2
where Table1.ID = Table2.ID

使查询正常工作而不引发错误。

实际上,有时候当您从另一个表的数据中更新一个表时,我认为导致这个错误的一个常见问题是,当您不正确地使用表的缩写 或者不需要的时候时。正确的陈述如下:

Update Table1
Set SomeField = t2.SomeFieldValue
From Table1 t1
Inner Join Table2 as t2
On t1.ID = t2.ID

请注意,来自 表1SomeField列没有 t1限定符 t1.SomeField,而只有 SomeField

如果有人试图通过指定 t1.SomeField来更新它,该语句将返回您已经注意到的多部分错误。

我有这个问题,结果是一个不正确的表别名。纠正这个问题就解决了。

更新表时,请确保不要通过别名引用更新的字段。

我只是在下面的代码中出现了错误

update [page]
set p.pagestatusid = 1
from [page] p
join seed s on s.seedid = p.seedid
where s.providercode = 'agd'
and p.pagestatusid = 0

我必须删除 set 语句中的别名引用,使其读起来如下所示

update [page]
set pagestatusid = 1
from [page] p
join seed s on s.seedid = p.seedid
where s.providercode = 'agd'
and p.pagestatusid = 0

我的错误是把模式放在桌子上,别名:

SELECT * FROM schema.CustomerOrders co
WHERE schema.co.ID = 1  -- oops!

我有 P.PayeeName AS 'Payer' --, 两个注释行抛出了这个错误

实际上我忘了加入其他人的桌子,这就是为什么我得到了错误

应该是这样的:

  CREATE VIEW reserved_passangers AS
SELECT dbo.Passenger.PassName, dbo.Passenger.Address1, dbo.Passenger.Phone
FROM dbo.Passenger, dbo.Reservation, dbo.Flight
WHERE (dbo.Passenger.PassNum = dbo.Reservation.PassNum) and
(dbo.Reservation.Flightdate = 'January 15 2004' and Flight.FlightNum =562)

不是这样的:

  CREATE VIEW reserved_passangers AS
SELECT dbo.Passenger.PassName, dbo.Passenger.Address1, dbo.Passenger.Phone
FROM dbo.Passenger, dbo.Reservation
WHERE (dbo.Passenger.PassNum = dbo.Reservation.PassNum) and
(dbo.Reservation.Flightdate = 'January 15 2004' and Flight.FlightNum = 562)

错误代码

FROM
dbo.Category C LEFT OUTER JOIN
dbo.SubCategory SC ON C.categoryID = SC.CategoryID AND C.IsActive = 'True' LEFT OUTER JOIN
dbo.Module M ON SC.subCategoryID = M.subCategoryID AND SC.IsActive = 'True' LEFT OUTER JOIN
dbo.SubModule SM ON M.ModuleID = SM.ModuleID AND M.IsActive = 'True' AND SM.IsActive = 'True' LEFT OUTER JOIN
dbo.trainer ON dbo.trainer.TopicID =dbo.SubModule.subModuleID

解决方案代码

 FROM
dbo.Category C LEFT OUTER JOIN
dbo.SubCategory SC ON C.categoryID = SC.CategoryID AND C.IsActive = 'True' LEFT OUTER JOIN
dbo.Module M ON SC.subCategoryID = M.subCategoryID AND SC.IsActive = 'True' LEFT OUTER JOIN
dbo.SubModule SM ON M.ModuleID = SM.ModuleID AND M.IsActive = 'True' AND SM.IsActive = 'True' LEFT OUTER JOIN
dbo.trainer ON dbo.trainer.TopicID = SM.subModuleID

正如您可以看到的,在错误代码中,dbo.SubModule已经定义为 SM,但是我在下一行中使用了 dbo.SubModule,因此出现了一个错误。 使用声明的名称而不是实际的名称。问题解决了。

当出现这种错误时,我的最佳建议是使用[]括号来排序表名,表的缩写有时会导致错误,(有时表的缩写就很好... ... 奇怪)

在我的例子中,在 front Set 字段中添加表别名会导致这个问题。

Update Table1
Set SomeField = t2.SomeFieldValue
From Table1 t1
Inner Join Table2 as t2
On t1.ID = t2.ID

错了

Update Table1
Set t1.SomeField = t2.SomeFieldValue
From Table1 t1
Inner Join Table2 as t2
On t1.ID = t2.ID

我得到了这个错误,只是不知道问题出在哪里。我仔细检查了我所有的化名和语法没有任何异常。该查询类似于我一直在编写的查询。

我决定重写查询(我最初是从报告中复制它的。Rdl 文件) ,并且运行良好。现在看看这些查询,它们对我来说看起来都一样,但是我重写的那个有用。

我只是想说如果其他方法都不管用的话也许值得一试。

当您键入 FROM 表时,这些错误将会消失。 在您输入的内容下面键入 FROM,然后 Intellisense 将工作,多部分标识符将工作。

我面对这个问题,并解决了它,但有一个区别,你和我的代码。尽管我认为你可以理解什么是“多部分标识符不能被绑定”

我用这个密码的时候

 select * from tbTest where email = sakira@gmail.com

我遇到了多部分标识问题

但当我使用单引号的电子邮件地址它解决了

 select * from tbTest where email = 'sakira@gmail.com'

我有完全相同的问题,和您的编码类似,我错过了 来自字段,一旦它被添加,查询知道从哪个表读取数据

在使用 SUBSTRING 方法删除方括号后,我的命令工作了

SUBSTRING ([ dbo.table ] . [ column ] ,15,2)

SUBSTRING (dbo.table.column,15,2)

CTRL + SHIFT + R (刷新智能感知)帮我搞定了。