Partager via


MSSQLSERVER_4104

Nouveau : 17 novembre 2008

Détails

Nom du produit

SQL Server

Version du produit

9.0

Numéro de build du produit

 

ID d'événement

4104

Source de l'événement

MSSQLSERVER

Composant

SQLEngine

Nom symbolique

ALG_MULTI_ID_BAD

Texte du message

L'identificateur en plusieurs parties « %.*ls » ne peut pas être lié.

Explication

Le nom d'une entité dans SQL Server porte le nom d'identificateur. Vous utilisez des identificateurs lorsque vous faites référence à des entités, par exemple en spécifiant des noms de colonnes et de tables dans une requête. Un identificateur en plusieurs parties contient un ou plusieurs qualificateurs comme préfixe. Par exemple, un identificateur de table peut être préfixé de qualificateurs tels que le nom de la base de données et le nom du schéma dans lequel se trouve la table, ou un identificateur de colonne peut être préfixé de qualificateurs tels que le nom de la table ou l'alias de table.

L'erreur 4104 indique que l'identificateur en plusieurs parties spécifié n'a pas pu être mappé à une entité existante. Cette erreur peut être retournée dans les cas suivants :

  • Le qualificateur fourni comme préfixe pour un nom de colonne ne correspond à aucun nom de table ou d'alias utilisé dans la requête.
    Par exemple, l'instruction suivante utilise un alias de table (Dept) comme préfixe de colonne, mais l'alias de table n'est pas référencé dans la clause FROM.

    SELECT Dept.Name FROM HumanResources.Department;
    

    Dans les instructions suivantes, un identificateur de colonne en plusieurs parties TableB.KeyCol est spécifié dans la clause WHERE dans le cadre d'une condition JOIN entre deux tables ; toutefois, TableB n'est pas référencé de manière explicite dans la requête.

    DELETE FROM TableA WHERE TableA.KeyCol = TableB.KeyCol;
    
    
    
    SELECT 'X' FROM TableA WHERE TableB.KeyCol = TableA.KeyCol;
    
  • Un nom d'alias pour la table est fourni dans la clause FROM, mais le qualificateur fourni pour une colonne est le nom de table. Par exemple, l'instruction suivante utilise le nom de table Department comme préfixe de colonne, mais la table a un alias (Dept) référencé dans la clause FROM.

    SELECT Department.Name FROM HumanResources.Department AS Dept;
    

    Lorsqu'un alias est utilisé, le nom de table ne peut être utilisé nulle part ailleurs dans l'instruction.

  • SQL Server est incapable de déterminer si l'identificateur en plusieurs parties fait référence à une colonne préfixée par une table ou à une propriété d'un type CLR défini par l'utilisateur préfixée par une colonne. Cela est dû au fait que les propriétés des colonnes de types de données définis par l'utilisateur (UDT, user-defined data type) sont référencées à l'aide du séparateur point (.) entre le nom de colonne et le nom de propriété, de la même façon qu'un nom de colonne est préfixé avec un nom de table. L'exemple suivant crée deux tables, a et b. La table b contient la colonne a, qui utilise un type CLR défini par l'utilisateur dbo.myudt2 comme type de données. L'instruction SELECT contient un identificateur en plusieurs parties a.c2.

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

    En supposant que le type de données défini par l'utilisateur myudt2 n'a pas de propriété nommée c2, SQL Server est incapable de déterminer si l'identificateur a.c2 fait référence à la colonne c2 dans la table a ou à la colonne a, propriété c2 dans la table b.

Action utilisateur

  • Faites correspondre les préfixes de colonnes aux noms de tables ou noms d'alias spécifiés dans la clause FROM de la requête. Si un alias est défini pour un nom de table dans la clause FROM, vous pouvez utiliser l'alias comme qualificateur uniquement pour les colonnes associées à cette table.
    Les instructions ci-dessus qui font référence à la table HumanResources.Department peuvent être corrigées comme suit :

    SELECT Dept.Name FROM HumanResources.Department AS Dept;
    GO
    
    
    
    SELECT Department.Name FROM HumanResources.Department;
    GO
    
  • Assurez-vous que toutes les tables sont spécifiées dans la requête et que les conditions JOIN entre les tables sont spécifiées correctement. L'instruction DELETE ci-dessus peut être corrigée comme suit :

    DELETE FROM dbo.TableA
    WHERE TableA.KeyCol = (SELECT TableB.KeyCol 
                            FROM TableB 
                            WHERE TableA.KeyCol = TableB.KeyCol);
    GO
    

    L'instruction SELECT ci-dessus pour TableA peut être corrigée comme suit :

    SELECT 'X' FROM TableA, TableB WHERE TableB.KeyCol = TableA.KeyCol;
    

    ou

    SELECT 'X' FROM TableA INNER JOIN TableB ON TableB.KeyCol = TableA.KeyCol;
    
  • Utilisez des noms uniques et clairement définis pour les identificateurs. Cela facilite la lecture et la maintenance de votre code et réduit également le risque de référence ambiguë à plusieurs entités.

Voir aussi

Autres ressources

Utilisation des identificateurs comme noms d'objet
Identificateurs
Principes de base des jointures

Aide et Informations

Assistance sur SQL Server 2005