Was ist eine mehrteilige Kennung und warum kann sie nicht gebunden werden?

136

Ich erhalte diese Fehler ständig, wenn ich versuche, Tabellen basierend auf einer anderen Tabelle zu aktualisieren. Am Ende schreibe ich die Abfrage neu, ändere die Reihenfolge der Verknüpfungen, ändere einige Gruppierungen und dann funktioniert es schließlich, aber ich verstehe es einfach nicht ganz.

Was ist eine mehrteilige Kennung?
Wann kann eine mehrteilige Kennung nicht gebunden werden?
Woran ist es überhaupt gebunden?
In welchen Fällen tritt dieser Fehler auf?
Was sind die besten Möglichkeiten, um dies zu verhindern?

Der spezifische Fehler von SQL Server 2005 lautet:

Die mehrteilige Kennung "..." konnte nicht gebunden werden.

Hier ist ein Beispiel:

UPDATE  [test].[dbo].[CompanyDetail]

SET Mnemonic = [dbBWKMigration].[dbo].[Company].[MNEMONIC], 
               [Company Code] = [dbBWKMigration].[dbo].[Company].[COMPANYCODE]

WHERE [Company Name] = **[dbBWKMigration].[dbo].[Company].[COMPANYNAME]**

Der eigentliche Fehler:

Nachricht 4104, Ebene 16, Status 1, Zeile 3 Die mehrteilige Kennung "dbBWKMigration.dbo.Company.COMPANYNAME" konnte nicht gebunden werden.

Sogar Mien
quelle

Antworten:

101

Ein mehrteiliger Bezeichner ist eine Beschreibung eines Felds oder einer Tabelle, die mehrere Teile enthält - zum Beispiel MyTable.SomeRow - wenn es nicht gebunden werden kann, bedeutet dies, dass etwas nicht stimmt - entweder haben Sie einen einfachen Tippfehler oder eine Verwechslung zwischen Tabelle und Spalte. Dies kann auch dadurch verursacht werden, dass Sie reservierte Wörter in Ihren Tabellen- oder Feldnamen verwenden und diese nicht mit [] umgeben. Dies kann auch dadurch verursacht werden, dass nicht alle erforderlichen Spalten in die Zieltabelle aufgenommen werden.

So etwas wie die redgate sql-Eingabeaufforderung ist hervorragend geeignet, um zu vermeiden, dass diese manuell eingegeben werden müssen (es werden sogar Verknüpfungen basierend auf Fremdschlüsseln automatisch vervollständigt), aber nicht kostenlos. SQL Server 2008 unterstützt Intellisense ab Werk, obwohl es nicht ganz so vollständig ist wie die Redgate-Version.

Schneebesen
quelle
6
Immer noch aktuell: Ihr Tippfehler hat mir den Tag gerettet.
Stefan
Tagessparkommentar für Neulinge: Überprüfen Sie einfach Ihren Tippfehler. Manchmal tritt er auf, wenn Sie ein kleines Stück vermissen. In meiner Ausgabe war es OBJECT_ID (Schema.Table) ohne Anführungszeichen in einer Abfrage mit mehr als 50 Zeilen.
Abdullah Ilgaz
57

Tatsächlich ist es manchmal, wenn Sie eine Tabelle aus den Daten einer anderen Tabelle aktualisieren, eines der häufigsten Probleme, die diesen Fehler verursachen, wenn Sie Ihre Tabellenabkürzungen falsch verwenden oder wenn sie nicht benötigt werden . Die richtige Aussage ist unten:

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

Beachten Sie, dass die SomeFieldSpalte aus Tabelle1 nicht das t1Qualifikationsmerkmal as hat, t1.SomeFieldsondern nur SomeField.

Wenn man versucht, es durch Angabe t1.SomeFieldder Anweisung zu aktualisieren, wird der mehrteilige Fehler zurückgegeben, den Sie bemerkt haben.

Amadelle
quelle
3
Das Hinzufügen eines Tabellenalias im vorderen Set-Feld verursacht in meinem Fall dieses Problem.
Malhaar Punjabi
1
Das war auch mein Problem. Ich hatte SET ABBREVIATION.My_Field, als ich es gerade brauchte SET.My_Field;
VSO
Ich bin bei der Verwendung von OPENJSON auf diesen Fehler gestoßen. `FROM cust c OUTER APPLY OPENJSON (cust.Addresses)` warf den Fehler. `FROM cust c OUTER APPLY OPENJSON (c.Addresses)` gab die Ergebnismenge zurück
Shaakir
17

Es ist wahrscheinlich ein Tippfehler. Suchen Sie in Ihrem Code nach den Stellen, an denen Sie [Schema] aufrufen. [Tabellenname] (im Grunde überall dort, wo Sie auf ein Feld verweisen) und stellen Sie sicher, dass alles richtig geschrieben ist.

Persönlich versuche ich dies zu vermeiden, indem ich Aliase für alle meine Tabellen verwende. Es ist enorm hilfreich, wenn Sie einen langen Tabellennamen auf ein Akronym seiner Beschreibung (z. B. WorkOrderParts -> WOP) kürzen können, und macht Ihre Abfrage besser lesbar.

Bearbeiten: Als zusätzlichen Bonus sparen Sie Tonnen von Tastenanschlägen, wenn Sie lediglich einen Alias ​​mit drei oder vier Buchstaben im Vergleich zu den Namen von Schema, Tabelle und Feld eingeben müssen.

Leutnant Frost
quelle
6

Bindung = Ihre Textdarstellung einer bestimmten Spalte wird einer physischen Spalte in einer Tabelle, in einer Datenbank oder auf einem Server zugeordnet.

Die mehrteilige Kennung könnte sein: MyDatabase.dbo.MyTable. Wenn Sie einen dieser Bezeichner falsch verstehen, haben Sie einen mehrteiligen Bezeichner, der nicht zugeordnet werden kann.

Der beste Weg, dies zu vermeiden, besteht darin, die Abfrage gleich beim ersten Mal richtig zu schreiben oder ein Plugin für Management Studio zu verwenden, das Intellisense bereitstellt und Ihnen so hilft, Tippfehler zu vermeiden.

Mark S. Rasmussen
quelle
5

Sie haben wahrscheinlich einen Tippfehler. Wenn Sie beispielsweise eine Tabelle mit dem Namen Customer in einer Datenbank mit dem Namen Sales haben, können Sie diese als Sales..Customer bezeichnen (obwohl es besser ist, sie mit dem Eigentümernamen (dbo ist der Standardeigentümer) wie Sales.dbo zu bezeichnen .Kunde.

Wenn Sie Sales ... Customer eingegeben haben, haben Sie möglicherweise die Nachricht erhalten, die Sie erhalten haben.

HLGEM
quelle
4

Wenn Sie sicher sind, dass es sich nicht um einen Tippfehler handelt, handelt es sich möglicherweise um einen Tippfehler.

Welche Zusammenstellung verwenden Sie? Prüfen Sie.

Pittsburgh DBA
quelle
4

Stellen Sie beim Aktualisieren von Tabellen sicher, dass Sie nicht auf das Feld verweisen, das Sie über den Alias ​​aktualisieren.

Ich hatte gerade den Fehler mit dem folgenden Code

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

Ich musste die Alias-Referenz in der set-Anweisung entfernen, damit sie so lautet

update [page] 
set pagestatusid = 1
from [page] p
join seed s on s.seedid = p.seedid
where s.providercode = 'agd'
and p.pagestatusid = 0
Upio
quelle
4

Ich habe festgestellt, dass ich diese häufig bekomme, wenn ich versuche, sie abzukürzen, wie zum Beispiel:

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

Ändern zu:

Table1, Table2 
where Table1.ID = Table2.ID

Lässt die Abfrage funktionieren und wirft den Fehler nicht aus.

jo-mso
quelle
2

Ich hatte dieses Problem und es stellte sich heraus, dass es sich um einen falschen Tabellenalias handelte. Durch Beheben dieses Problems wurde das Problem behoben.

Matt Setter
quelle
2

Meins hat das Schema versehentlich auf den Tisch gelegt. Alias:

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

Das Hinzufügen eines Tabellenalias im vorderen Set-Feld verursacht in meinem Fall dieses Problem.

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

Falsche Aktualisierung Tabelle1 Setzen Sie t1.SomeField = t2.SomeFieldValue aus Tabelle1 t1 Inner Join Table2 als t2 On t1.ID = t2.ID.

Malhaar Punjabi
quelle
1

Ich hatte P.PayeeName AS 'Payer' --, und die beiden Kommentarzeilen warfen diesen Fehler

Andrew Day
quelle
1

Ich habe tatsächlich vergessen, den Tisch mit den anderen zu verbinden, deshalb habe ich den Fehler bekommen

Angeblich so:

  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)

Und nicht so:

  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)
MT_Shikomba
quelle
1

Fehlercode

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 

Lösungscode

 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 

Wie Sie sehen können, ist der Fehlercode dbo.SubModulebereits als SM definiert, aber ich verwende ihn dbo.SubModulein der nächsten Zeile, daher ist ein Fehler aufgetreten. Verwenden Sie den deklarierten Namen anstelle des tatsächlichen Namens. Problem gelöst.

Onkar Vidhate
quelle
1

Mein bester Rat, wenn der Fehler auftritt, ist die Verwendung von [] Klammern, um Tabellennamen zu umgeben. Die Abkürzung von Tabellen verursacht manchmal Fehler (manchmal funktionieren Tabellenabkürzungen einfach gut ... seltsam).

ramnz
quelle
1

Ich habe diesen Fehler erhalten und konnte einfach nicht sehen, wo das Problem lag. Ich habe alle meine Aliase und Syntax überprüft und nichts sah fehl am Platz aus. Die Abfrage ähnelte denen, die ich die ganze Zeit schreibe.

Ich habe mich entschlossen, die Abfrage (ich hatte sie ursprünglich aus einer .rdl-Berichtsdatei kopiert) unten erneut zu schreiben, und sie lief einwandfrei. Wenn ich mir jetzt die Abfragen ansehe, sehen sie für mich gleich aus, aber meine neu geschriebene funktioniert.

Ich wollte nur sagen, dass es einen Versuch wert sein könnte, wenn nichts anderes funktioniert.

Clamum
quelle
1

Wenn Sie die FROM-Tabelle eingeben, verschwinden diese Fehler. Geben Sie FROM unterhalb Ihrer Eingabe ein, dann funktioniert Intellisense und die mehrteilige Kennung funktioniert.

David Morrow
quelle
0

Ich habe mich diesem Problem gestellt und es gelöst, aber es gibt einen Unterschied zwischen Ihrem und meinem Code. Trotzdem denke ich, dass Sie verstehen können, was "der mehrteilige Bezeichner konnte nicht gebunden werden" ist.

Als ich diesen Code verwendet habe

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

Ich hatte ein Problem mit der mehrteiligen Kennung

aber wenn ich ein einfaches Anführungszeichen für die E-Mail-Adresse verwende, ist es gelöst

 select * from tbTest where email = '[email protected]'
Neloy Sarothi
quelle