MSSQLSERVER_4104
S'applique à : SQL Server
Détails
Attribut | Valeur |
---|---|
Nom du produit | SQL Server |
ID de l’é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 est appelé son identificateur. Vous utilisez des identificateurs chaque fois que vous référencez des entités, par exemple en spécifiant les noms des colonnes et des tables dans une requête. Un identificateur en plusieurs parties contient un ou plusieurs qualificateurs en tant que préfixe pour l'identificateur. Par exemple, un identificateur de table peut avoir pour préfixe des qualificateurs tels que le nom de la base de données et le nom du schéma dans lesquels la table est contenue, ou un identificateur de colonne peut avoir pour préfixe des qualificateurs tels qu'un nom de table ou un 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 conditions suivantes :
Le qualificateur fourni en tant que 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
) en tant que 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é explicitement 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 est spécifié pour la table dans la clause FROM, mais le qualificateur fourni pour une colonne correspond au nom de la table. Par exemple, l'instruction suivante utilise le nom de table
Department
en tant que préfixe de colonne ; toutefois, 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 pas être utilisé ailleurs dans l'instruction.
SQL Server ne peut pas déterminer si l’identificateur multipart fait référence à une colonne précédée d’une table ou à une propriété d’un type de données défini par l’utilisateur CLR (UDT) précédé d’une colonne. Cette situation se présente, car les propriétés des colonnes UDT sont référencées à l'aide du point de séparation (.), placé entre le nom de la colonne et le nom de la propriété, de la même manière qu'un nom de colonne est préfixé à l'aide d'un nom de table. L’exemple suivant crée deux tables,
a
etb
. La tableb
contient la colonnea
, qui utilise un UDT CLRdbo.myudt2
en tant que 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 l’UDT
myudt2
n’a pas de propriété nomméec2
, SQL Server ne peut pas 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 de l’utilisateur
Faites correspondre les préfixes de colonnes aux noms de tables ou 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, seul cet alias peut être utilisé en tant que qualificateur pour les colonnes associées à cette table.
Les instructions ci-dessus qui référencent 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
Vérifiez 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;
or
SELECT 'X' FROM TableA INNER JOIN TableB ON TableB.KeyCol = TableA.KeyCol;
Utilisez des noms uniques et clairement définis pour les identificateurs. Vous facilitez ainsi la lecture et la gestion de votre code et vous réduisez également le risque de références ambiguës à plusieurs entités.