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

当我尝试更新基于另一个表的表时,我不断得到这些错误。 我最终重写查询,改变连接的顺序,改变一些分组,然后它最终工作,但我只是不完全得到它。

什么是“多部分标识符”?
何时“多部分标识符”不能被绑定?
什么是绑定呢?
在什么情况下会发生这种错误?
什么是防止它的最好方法?

SQL Server 2005的具体错误是:

多部分标识符“…”不能被绑定。

这里是一个例子:

UPDATE [test].[dbo].[CompanyDetail] SET Mnemonic = [dbBWKMigration].[dbo].[Company].[MNEMONIC], [Company Code] = [dbBWKMigration].[dbo].[Company].[COMPANYCODE] WHERE [Company Name] = **[dbBWKMigration].[dbo].[Company].[COMPANYNAME]** 

实际的错误:

消息4104,级别16,状态1,行3无法绑定多部分标识符“dbBWKMigration.dbo.Company.COMPANYNAME”。

多部分标识符是包含多个部分的字段或表的任何描述 – 例如MyTable.SomeRow – 如果它不能被绑定,那意味着它有什么问题 – 要么是简单的错字,要么是混淆表和列。 也可能是由于在表格或字段名称中使用保留字而不是用[]包围它们。

像redgate的sql提示是聪明的,以避免不得不手动input这些(它甚至自动完成基于外键的连接),但不是免费的。 SQL Server 2008支持开箱即用的智能感知,尽pipe它并不像红帽版本那么完整。

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

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

请注意, Table1中的SomeField列没有t1限定符作为t1.SomeField而只是SomeField

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

这可能是一个错字。 在你调用[schema] [TableName]的地方查找代码(基本上你引用一个字段的地方),确保所有的东西拼写正确。

就我个人而言,我尝试通过为我所有的表使用别名来避免这种情况。 当你可以将一个长表名称缩短为它的描述的首字母缩写(即WorkOrderParts – > WOP)时,它会有很大的帮助,并且使查询更具可读性。

编辑:作为一个额外的好处,当所有你必须键入的是三个或四个字母的别名与模式,表和字段名称都在一起时,您将节省吨击键。

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

多部分标识符可以是:MyDatabase.dbo.MyTable。 如果你有任何这些标识符错误,那么你有一个无法映射的多部分标识符。

避免这种情况的最好办法是首次正确编写查询语句,或者使用提供intellisense的pipe理工作室插件,从而避免input错误。

如果您确定这不是拼写错误的拼写错误,也许这是一个错误的案例。

你使用什么sorting规则? 核实。

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

我只是有以下代码的错误

 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 

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

如果您键入Sales … Customer,您可能已收到您收到的消息。

当我尝试缩写时,我发现我得到了很多,比如:

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

将其更改为:

 Table1, Table2 where Table1.ID = Table2.ID 

使查询工作,而不是抛出错误。

我错误地把模式放在表Alias上:

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

我有这个问题,原来是一个不正确的表别名。 纠正这个问题已经解决了。

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

我其实忘记了join到其他人那就是为什么我得到了错误

假设是这样的:

  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)