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

Eve*_*ien 126 sql sql-server

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

什么是"多部分标识符"?
何时"多部分标识符"无法绑定?
无论如何它到底是什么?
在什么情况下会发生此错误?
什么是预防它的最佳方法?

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]**
Run Code Online (Sandbox Code Playgroud)

实际错误:

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

Whi*_*isk 86

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

redgate sql提示这样的东西很棒,因为它们不必手动输入这些(它甚至可以自动完成基于外键的连接),但不是免费的.SQL Server 2008支持intellisense开箱即用,虽然它不像redgate版本那么完整.

  • 还是实际的:你的拼写提示节省了我的一天. (4认同)

小智 52

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

Update Table1
Set SomeField = t2.SomeFieldValue 
From Table1 t1 
Inner Join Table2 as t2
    On t1.ID = t2.ID
Run Code Online (Sandbox Code Playgroud)

请注意,Table1中的SomeField列没有限定符,但只是. t1t1.SomeFieldSomeField

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

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

Lie*_*ost 16

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

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

编辑:作为一个额外的好处,当你需要输入的是三个或四个字母的别名而不是模式,表格和字段名称时,你将节省大量的击键次数.


Mar*_*sen 6

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

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

避免这种情况的最佳方法是立即编写查询,或者使用Management Studio的插件来提供智能感知,从而避免输入错误,从而帮助您解决问题。


HLG*_*GEM 5

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

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


小智 5

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

Table1 t1, Table2 t2 
where t1.ID = t2.ID
Run Code Online (Sandbox Code Playgroud)

将其更改为:

Table1, Table2 
where Table1.ID = Table2.ID
Run Code Online (Sandbox Code Playgroud)

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