「マルチパート識別子」とは何ですか?なぜバインドできないのですか?


136

別のテーブルに基づいてテーブルを更新しようとすると、これらのエラーが頻繁に発生します。クエリを書き直して、結合の順序を変更し、いくつかのグループ化を変更すると、最終的には機能しますが、うまくいきません。

「マルチパート識別子」とは何ですか?
「マルチパート識別子」をバインドできないのはいつですか?
とにかくそれは何にバインドされていますか?
このエラーはどのような場合に発生しますか?
それを防ぐ最善の方法は何ですか?

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」をバインドできませんでした。

回答:


101

マルチパート識別子は、MyTable.SomeRowなどの複数のパートを含むフィールドまたはテーブルの説明であり、バインドできない場合は、何か問題があることを意味します-単純なタイプミスがあるか、テーブルと列。また、テーブル名またはフィールド名で予約語を使用し、それらを[]で囲まないことによっても発生する可能性があります。また、ターゲットテーブルに必要な列がすべて含まれていないことが原因である可能性もあります。

redgate sqlプロンプトのようなものは、手動でこれらを入力する必要をなくすために優れています(外部キーに基づいて結合をオートコンプリートすることもできます)が、無料ではありません。SQL Server 2008はそのままでIntelliSenseをサポートしていますが、Redgateバージョンほど完全ではありません。


6
まだ実際:あなたのタイプミスのヒントは私の日を救った。
ステファン

初心者のためのデイセーバーのコメント:タイプミスを確認してください。小さな欠落しているときに発生することもあります。私の問題では、50行以上のクエリで引用符のないOBJECT_ID(Schema.Table)でした。
アブドライルガズ

57

実際、あるテーブルを別のテーブルのデータから更新しているとき、このエラーの原因となる一般的な問題の1つは、テーブルの省略形を誤って使用した場合や、必要ない場合です。正しい説明は以下のとおりです。

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

お知らせいることSomeFieldから列表1は持っていないt1として修飾子をt1.SomeFieldただであるが、SomeField

t1.SomeFieldステートメントを指定して更新しようとすると、気づいたマルチパートエラーが返されます。


3
フロントセットフィールドにテーブルエイリアスを追加すると、私の場合この問題が発生します。
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

あなたは、から説明を見つけるかもしれないsqlservertutorial.net/sql-server-basics/sql-server-update-join役立つ:
CAtoOH

17

それはおそらくタイプミスです。コード内で[schema]。[TableName]を呼び出す場所(基本的にはフィールドを参照する場所)を探し、すべてのスペルが正しいことを確認します。

個人的には、すべてのテーブルにエイリアスを使用してこれを回避しようとしています。長いテーブル名をその説明の頭字語(つまりWorkOrderParts-> WOP)に短縮できる場合に非常に役立ち、クエリが読みやすくなります。

編集:追加のボーナスとして、入力する必要があるのが3文字または4文字のエイリアスではなく、スキーマ、テーブル、およびフィールドの名前をすべて一緒にすると、大量のキーストロークを節約できます。


6

バインディング=特定の列のテキスト表現は、サーバーのデータベース、データベース、テーブルの物理列にマップされます。

マルチパート識別子は、MyDatabase.dbo.MyTableのようになります。これらの識別子のいずれかが間違っている場合、マップできないマルチパート識別子があります。

これを回避する最良の方法は、クエリを最初に正しく記述するか、IntelliSenseを提供する管理スタジオ用のプラグインを使用して、タイプミスを回避することです。


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

フロントセットフィールドにテーブルエイリアスを追加すると、私の場合この問題が発生します。

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

誤った 更新Table1 Set t1.SomeField = t2.SomeFieldValue From Table1 t1 Inner Join Table2 as t2 On 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'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.