首页 文章

什么是'multi-part identifier',为什么不能绑定它?

提问于
浏览
108

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

什么是'multi-part identifier'?
什么时候'multi-part identifier'无法绑定?
无论如何它到底是什么?
在什么情况下会发生此错误?
预防它的最佳方法是什么?

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

15 回答

  • 3

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

    redgate sql prompt这样的东西非常出色,可以避免手动输入这些内容(甚至可以根据外键自动完成连接),但是并不像redgate版本那样完整 .

  • 4

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

    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 尝试更新它,则该语句将返回您注意到的多部分错误 .

  • 3

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

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

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

  • 3

    绑定=特定列的文本表示形式将映射到某些服务器上某些数据库中的某个表中的物理列 .

    多部分标识符可以是:MyDatabase.dbo.MyTable . 如果您收到任何这些标识符错误,那么您将拥有无法映射的多部分标识符 .

    避免它的最好方法是第一次正确编写查询,或者使用提供intellisense的管理工作室插件,从而避免拼写错误 .

  • 13

    如果你确定这不是一个拼写错误的拼写,也许这是一个错字的情况 .

    你使用什么整理?核实 .

  • 1

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

    我刚刚遇到以下代码的错误

    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
    
  • 44

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

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

    将其更改为:

    Table1, Table2 
    where Table1.ID = Table2.ID
    

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

  • 0

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

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

  • 0

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

  • 1

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

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

    我有 P.PayeeName AS 'Payer' --, ,两条注释行引发了这个错误

  • 0

    我实际上忘了加入 table ,这就是我得到错误的原因

    假设是这样的:

    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)
    
  • 0

    Error Code

    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
    

    Solution Code

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

  • 3

    出现错误时我最好的建议是使用[] braquets来覆盖表名,表的缩写有时会导致错误,(有时候表缩写只是工作正常......很奇怪)

  • 77

    在前面的Set字段中添加表别名会导致我的问题 .

    Right 更新表1设置SomeField = t2.SomeFieldValue从Table1 t1 Inner Join Table2 as t2 on t1.ID = t2.ID

    Wrong 更新表1设置t1.SomeField = t2.SomeFieldValue从Table1 t1内部连接表2为t2在t1.ID = t2.ID

相关问题