Freigeben über


MSSQLSERVER_4104

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.KeyCol als Teil einer JOIN-Bedingung zwischen zwei Tabellen angegeben, jedoch wird TableB in 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 Department als 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, a und b, erstellt. Die Tabelle b enthält Eine Spalte a, die einen CLR UDT dbo.myudt2 als Datentyp verwendet. Die SELECT-Anweisung enthält einen mehrteiligen Bezeichner a.c2.

    CREATE TABLE a (c2 int);   
    GO  
    
    CREATE TABLE b (a dbo.myudt2);   
    GO  
    
    SELECT a.c2 FROM a, b;   
    

    Wenn die UDT myudt2 nicht über eine Eigenschaft mit dem Namen verfügt c2, kann SQL Server nicht bestimmen, ob der Bezeichner a.c2auf die Spalte c2 in tabelle a oder auf die Spalte a, Eigenschaft c2 in tabelle bverweist.

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.Department Tabelle verweisen, können wie folgt korrigiert werden:

    SELECT Dept.Name FROM HumanResources.Department AS Dept;  
    GO  
    
    SELECT Department.Name FROM HumanResources.Department;  
    GO  
    
  • Stellen 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);  
    GO  
    

    Die obenstehende SELECT-Anweisung für TableA kann 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.

Siehe auch

MSSQLSERVER_107
Datenbankbezeichner