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


137

当我尝试基于另一个表更新表时,我不断收到这些错误。我最终重写了查询,更改了连接顺序,更改了一些分组,然后最终起作用了,但是我只是不太了解。

什么是“多部分标识符”?
什么时候不能绑定“多部分标识符”?
它到底绑定了什么?
在什么情况下会发生此错误?
预防它的最佳方法是什么?

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”。

Answers:


101

多部分标识符是对包含多个部分的字段或表的任何描述-例如MyTable.SomeRow-如果无法绑定,则意味着存在问题-您可能是一个简单的错字,或者是表和列。也可能是由于在表名或字段名中使用保留字而不用[]引起的。也可能是由于未在目标表中包括所有必需的列。

诸如redgate sql提示符之类的东西非常出色,可以避免手动键入这些字符(它甚至可以基于外键自动完成联接),但这不是免费的。SQL Server 2008开箱即用地支持智能感知,尽管它不如redgate版本完整。


6
仍然是实际的:您的错字提示挽救了我的生活。
斯蒂芬

针对新手的日间节省者评论:只需检查一下您的错别字,有时会在您遗失一小部分时发生。在我的问题中,它是OBJECT_ID(Schema.Table),在50多行的查询中没有任何引号。
阿卜杜拉·伊尔加兹

57

实际上,有时候从另一张表的数据更新一张表时,我认为导致此错误的常见问题之一是错误地使用表缩写或不需要它们时。正确的语句如下:

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

请注意,表1中的SomeField列没有限定词,而是。 t1t1.SomeFieldSomeField

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


3
在我的情况下,在前端Set字段中添加表别名会导致此问题。
Malhaar Punjabi

1
这也是我的问题。我ABBREVIATION.My_Field刚需要的时候就坐了SET SET.My_Field;
VSO

使用OPENJSON时遇到此错误。`from cust c OUTER APPLY OPENJSON(cust.Addresses)`引发了错误。`from cust c OUTER APPLY OPENJSON(c.Addresses)`给出了结果集
Shaakir


17

这可能是一个错字。在代码中查找您称为[schema]。[TableName]的位置(基本上是引用字段的任何地方),并确保所有内容均拼写正确。

就个人而言,我尝试通过对所有表使用别名来避免这种情况。当您可以将较长的表名缩短为描述的缩写时(即WorkOrderParts-> WOP),这将极大地帮助您,并且还使您的查询更具可读性。

编辑:作为一项额外的奖励,当您只需要输入三个或四个字母的别名而不是架构,表和字段名称时,您将节省大量按键操作。


6

绑定=您特定列的文本表示形式已映射到某台服务器上某个表,某个数据库中的物理列。

多部分标识符可以是:MyDatabase.dbo.MyTable。如果您错误地使用了这些标识符,则您有一个无法映射的多部分标识符。

避免这种情况的最佳方法是立即编写查询,或者使用Management Studio的插件来提供智能感知,从而避免拼写错误。


5

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

如果键入Sales ... Customer,则可能已收到消息。


4

如果您确定不是拼写错误,也许是错别字。

您正在使用什么排序规则?核实。


4

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

我只是以下代码有错误

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

4

我发现我尝试缩写时会得到很多,例如:

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

更改为:

Table1, Table2 
where Table1.ID = Table2.ID

使查询有效,并且不会引发错误。


3

错误代码

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在下一行中使用,因此出现了错误。使用声明的名称而不是实际名称。问题解决了。


2

我遇到了这个问题,事实证明这是一个错误的表别名。更正此问题已解决。


2

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

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

2

在我的情况下,在前面的Set字段中添加表别名会导致此问题。

更新Table1设置Table1中的SomeField = t2.SomeFieldValue t1内部联接Table2为t2在t1.ID = t2.ID

错误的 更新Table1设置t1.SomeField = t2.SomeFieldValue来自Table1 t1内部联接Table2为t2在t1.ID = t2.ID



1

我实际上忘记将桌子与其他桌子连接在一起,这就是为什么我收到错误消息

假设是这样的:

  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)

1

出现错误时,我最好的建议是使用[]括号来存储表名,表的缩写有时会导致错误,(有时表的缩写工作得很好...很奇怪)


1

我收到此错误,只是看不到问题出在哪里。我仔细检查了所有别名和语法,没有发现任何异常。该查询类似于我一直写的查询。

我决定再次重写下面的查询(我原来是从报表.rdl文件复制它的),然后再次运行就可以了。现在看这些查询,它们在我看来都是一样的,但是我重写的一个有效。

只是想说,如果没有其他办法,那就值得一试。


1

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


0

我面对并解决了这个问题,但是您的代码和我的代码之间有区别。尽管我认为您可以理解什么是“无法绑定多部分标识符”

当我使用这段代码

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

我遇到了多部分标识符问题

但是当我使用单引号作为电子邮件地址时,它解决了

 select * from tbTest where email = 'sakira@gmail.com'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.