Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Einzelheiten
| Produktname | SQL Server |
| Ereignis-ID | 4104 |
| Ereignisquelle | MSSQLSERVER |
| Komponente | SQLEngine |
| Symbolischer Name | ALG_MULTI_ID_BAD |
| Meldungstext | Der mehrteilige Bezeichner "%.*ls" konnte nicht gebunden werden. |
Erklärung
Der Name einer Entität in SQL Server wird als Bezeichner bezeichnet. Sie verwenden Bezeichner, wenn Sie auf Entitäten verweisen, z. B. durch Angeben von Spalten- und Tabellennamen in einer Abfrage. Ein mehrteiliger Bezeichner enthält mindestens einen Qualifizierer als Präfix für den Bezeichner. Ein Tabellenbezeichner kann z. B. Qualifizierern vorangestellt werden, z. B. dem Datenbanknamen und dem Schemanamen, in dem die Tabelle enthalten ist, oder ein Spaltenbezeichner kann Qualifizierern vorangestellt werden, z. B. einem Tabellennamen oder Tabellenalias.
Fehler 4104 gibt an, dass der angegebene mehrteilige Bezeichner keiner vorhandenen Entität zugeordnet werden konnte. Dieser Fehler kann unter den folgenden Bedingungen zurückgegeben werden:
Der als Präfix für einen Spaltennamen angegebene Qualifizierer entspricht keinem Tabellen- oder Aliasnamen, der in der Abfrage verwendet wird.
Die folgende Anweisung verwendet beispielsweise einen Tabellenalias (
Dept) als Spaltenpräfix, aber der Tabellenalias wird in der FROM-Klausel nicht referenziert.SELECT Dept.Name FROM HumanResources.Department;In den folgenden Anweisungen wird in der WHERE-Klausel ein mehrteiliger Spaltenbezeichner
TableB.KeyColals Teil einer JOIN-Bedingung zwischen zwei Tabellen angegeben, jedoch wirdTableBin der Abfrage nicht explizit referenziert.DELETE FROM TableA WHERE TableA.KeyCol = TableB.KeyCol;SELECT 'X' FROM TableA WHERE TableB.KeyCol = TableA.KeyCol;Ein Aliasname für die Tabelle wird in der FROM-Klausel angegeben, der für eine Spalte angegebene Qualifizierer ist jedoch der Tabellenname. Die folgende Anweisung verwendet z. B. den Tabellennamen
Departmentals Spaltenpräfix. Die Tabelle weist jedoch einen Alias (Dept) auf, auf den in der FROM-Klausel verwiesen wird.SELECT Department.Name FROM HumanResources.Department AS Dept;Wenn ein Alias verwendet wird, kann der Tabellenname nicht an anderer Stelle in der Anweisung verwendet werden.
SQL Server kann nicht ermitteln, ob sich der mehrteilige Bezeichner auf eine Spalte bezieht, die einer Tabelle oder einer Eigenschaft eines benutzerdefinierten CLR-Datentyps (USER-Defined Data Type, UDT) vorangestellt ist. Dies geschieht, da auf Eigenschaften von UDT-Spalten mithilfe des Punkttrennzeichens (.) zwischen dem Spaltennamen und dem Eigenschaftennamen auf die gleiche Weise verwiesen wird, wie einem Spaltennamen ein Tabellenname vorangestellt wird. Im folgenden Beispiel werden zwei Tabellen,
aundb, erstellt. Die Tabellebenthält Eine Spaltea, die einen CLR UDTdbo.myudt2als Datentyp verwendet. Die SELECT-Anweisung enthält einen mehrteiligen Bezeichnera.c2.CREATE TABLE a (c2 int); GOCREATE TABLE b (a dbo.myudt2); GOSELECT a.c2 FROM a, b;Wenn die UDT
myudt2nicht über eine Eigenschaft mit dem Namen verfügtc2, kann SQL Server nicht bestimmen, ob der Bezeichnera.c2auf die Spaltec2in tabelleaoder auf die Spaltea, Eigenschaftc2in tabellebverweist.
Benutzeraktion
Stimmen Sie die Spaltenpräfixe mit den Tabellennamen oder Aliasnamen überein, die in der FROM-Klausel der Abfrage angegeben sind. Wenn ein Alias für einen Tabellennamen in der FROM-Klausel definiert ist, können Sie den Alias nur als Qualifizierer für Spalten verwenden, die dieser Tabelle zugeordnet sind.
Die obigen Anweisungen, die auf die
HumanResources.DepartmentTabelle verweisen, können wie folgt korrigiert werden:SELECT Dept.Name FROM HumanResources.Department AS Dept; GOSELECT Department.Name FROM HumanResources.Department; GOStellen Sie sicher, dass alle Tabellen in der Abfrage angegeben sind und dass die JOIN-Bedingungen zwischen Tabellen korrekt angegeben sind. Die obige DELETE-Anweisung kann wie folgt korrigiert werden:
DELETE FROM dbo.TableA WHERE TableA.KeyCol = (SELECT TableB.KeyCol FROM TableB WHERE TableA.KeyCol = TableB.KeyCol); GODie obenstehende SELECT-Anweisung für
TableAkann wie folgt verbessert werden:SELECT 'X' FROM TableA, TableB WHERE TableB.KeyCol = TableA.KeyCol;oder
SELECT 'X' FROM TableA INNER JOIN TableB ON TableB.KeyCol = TableA.KeyCol;Verwenden Sie eindeutige, klar definierte Namen für Bezeichner. Dies erleichtert das Lesen und Verwalten des Codes und minimiert auch das Risiko mehrdeutiger Verweise auf mehrere Entitäten.