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.
Gilt für: SQL Server
Details
| attribute | Wert |
|---|---|
| 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 immer dann, wenn Sie auf Entitäten verweisen, z. B. durch das Angeben von Spalten- und Tabellennamen in einer Abfrage. Ein mehrteiliger Bezeichner enthält einen oder mehrere Qualifizierer als Präfix für den Bezeichner. Einem Tabellenbezeichner können z. B. Qualifizierer vorangestellt werden, wie z. B. der Datenbankname und der Name des Schemas, in dem die Tabelle enthalten ist, oder einer Spalten-ID können Qualifizierer vorangestellt werden, wie z. B. ein Tabellenname oder ein Tabellenalias.
Der Fehler 4104 gibt an, dass der angegebene mehrteilige Bezeichner keiner vorhandenen Entität zugeordnet werden konnte. Dieser Fehler kann unter folgenden Bedingungen zurückgegeben werden:
Der als Präfix für einen Spaltennamen angegebene Qualifizierer stimmt mit keinem in der Abfrage verwendeten Tabellen- oder Aliasnamen überein.
In der folgenden Anweisung wird beispielsweise ein Tabellenalias (
Dept) als Spaltenpräfix verwendet, es wird jedoch in der FROM-Klausel nicht auf den Tabellenalias verwiesen.SELECT Dept.Name FROM HumanResources.Department;In den folgenden Anweisungen wird eine mehrteilige Spalten-ID
TableB.KeyColin der WHERE-Klausel als Teil einer JOIN-Bedingung zwischen zwei Tabellen angegeben, aufTableBwird in der Abfrage jedoch nicht explizit verwiesen.DELETE FROM TableA WHERE TableA.KeyCol = TableB.KeyCol;SELECT 'X' FROM TableA WHERE TableB.KeyCol = TableA.KeyCol;In der FROM-Klausel wird ein Aliasname für die Tabelle festgelegt, aber der für eine Spalte angegebene Qualifizierer ist der Tabellenname. In der folgenden Anweisung wird beispielsweise der Tabellenname
Departmentals Spaltenpräfix verwendet, die Tabelle verfügt jedoch über einen Alias (Dept), auf den in der FROM-Klausel verwiesen wird.SELECT Department.Name FROM HumanResources.Department AS Dept;Falls ein Alias verwendet wird, kann der Tabellenname nicht anderweitig 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 liegt daran, dass auf Eigenschaften von UDT-Spalten mithilfe eines Punkts als Trennzeichen (.) zwischen dem Spaltennamen und dem Eigenschaftsnamen auf dieselbe Weise verwiesen wird, wie einem Spaltennamen ein Tabellenname vorangestellt wird. Im folgenden Beispiel werden zwei Tabellen erstellt:
aundb. Die Tabellebenthält die Spaltea, die einen CLR UDTdbo.myudt2als Datentyp verwendet. Die SELECT-Anweisung enthält einem 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
Gleichen Sie die Spaltenpräfixe mit den in der FROM-Klausel der Abfrage angegeben Tabellen- oder Aliasnamen ab. Wenn in der FROM-Klausel ein Alias für einen Tabellennamen definiert wurde, kann der Alias nur als Qualifizierer für Spalten verwendet werden, die dieser Tabelle zugeordnet sind.
Die oben genannten Anweisungen, die auf die
HumanResources.Department-Tabelle verweisen, können folgendermaßen 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 werden und dass die JOIN-Bedingungen zwischen Tabellen ordnungsgemäß angegeben werden. Die oben genannte DELETE-Anweisung kann folgendermaßen korrigiert werden:
DELETE FROM dbo.TableA WHERE TableA.KeyCol = (SELECT TableB.KeyCol FROM TableB WHERE TableA.KeyCol = TableB.KeyCol); GODie oben genannte SELECT-Anweisung für
TableAkann folgendermaßen korrigiert werden:SELECT 'X' FROM TableA, TableB WHERE TableB.KeyCol = TableA.KeyCol;or
SELECT 'X' FROM TableA INNER JOIN TableB ON TableB.KeyCol = TableA.KeyCol;Verwenden Sie eindeutige, klar definierte Namen für Bezeichner. Dadurch wird der Code einfacher zu lesen und zu warten, und das Risiko mehrdeutiger Verweise auf mehrere Entitäten wird minimiert.