MSSQLSERVER_4104

Neu: 17. November 2008

Details

Produktname

SQL Server

Produktversion

9.0

Buildnummer des Produkts

 

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 Bezeichner genannt. 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, z. B. der Datenbankname und der Name des Schemas, in dem die Tabelle enthalten ist. Außerdem können einer Spalten-ID Qualifizierer vorangestellt werden, 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, in der FROM-Klausel wird jedoch nicht auf den Tabellenalias verwiesen.

    SELECT Dept.Name FROM HumanResources.Department;
    

    In den folgenden Anweisungen wird eine mehrteilige Spalten-ID TableB.KeyCol in der WHERE-Klausel als Teil einer JOIN-Bedingung zwischen zwei Tabellen angegeben, auf TableB wird 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 angegeben, der für eine Spalte angegebene Qualifizierer ist jedoch der Tabellenname. In der folgenden Anweisung wird beispielsweise der Tabellenname Department als 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;
    

    Wenn ein Alias verwendet wird, kann der Tabellenname nicht an anderer Stelle in der Anweisung verwendet werden.

  • SQL Server kann nicht festlegen, ob der mehrteilige Bezeichner sich auf eine Spalte bezieht, der eine Tabelle vorangestellt ist, oder auf eine Eigenschaft eines benutzerdefinierten CLR-Datentyps (User-Defined Data Type, UDT), dem eine Spalte 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, a und b. Tabelle b enthält die 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 der UDT myudt2 nicht über eine Eigenschaft mit der Bezeichnung c2 verfügt, kann SQL Server nicht ermitteln, ob der Bezeichner a.c2 auf die Spalte c2 in der Tabelle a oder auf die Spalte a und die Eigenschaft c2 in der Tabelle b verweist.

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

    Die oben genannte SELECT-Anweisung für TableA kann folgendermaßen korrigiert 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. Dadurch wird der Code einfacher zu lesen und zu verwalten, und das Risiko von mehrdeutigen Verweisen auf mehrere Entitäten wird minimiert.

Siehe auch

Andere Ressourcen

Verwenden von Bezeichnern als Objektnamen
Bezeichner
Grundlegendes zu Verknüpfungen

Hilfe und Informationen

Informationsquellen für SQL Server 2005