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
etb
. La tableb
contient la colonnea
, qui utilise un type CLR défini par l'utilisateurdbo.myudt2
comme type de données. L'instruction SELECT contient un identificateur en plusieurs partiesa.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éec2
, SQL Server est incapable de déterminer si l'identificateura.c2
fait référence à la colonnec2
dans la tablea
ou à la colonnea
, propriétéc2
dans la tableb
.
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 tableHumanResources.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