MSSQLSERVER_207

Détails

Nom de produit

SQL Server

Version du produit

10.50

Numéro de build du produit

 

ID d'événement

207

Source de l'événement

MSSQLSERVER

Composant

SQLEngine

Nom symbolique

SQ_BADCOL

Texte du message

Nom de colonne non valide : '%.*ls'.

Explication

Cette erreur de requête peut être causée par l'un des problèmes suivants.

  • Le nom de colonne est mal orthographié ou la colonne n'existe pas dans les tables spécifiées.

  • Le classement de la base de données respecte la casse et la casse du nom de colonne spécifié dans la requête ne correspond pas à celle de la colonne définie dans la table. Par exemple, lorsqu'une colonne est définie dans une table en tant que LastName et que la base de données utilise un classement qui respecte la casse, les requêtes qui font référence à cette colonne en tant que Lastname ou lastname retournent l'erreur 207 parce que le nom de colonne ne correspond pas.

  • Un alias de colonne, défini dans la clause SELECT, est référencé dans une autre clause telle que WHERE ou GROUP BY. Par exemple, la requête suivante définit l'alias de colonne Year dans la clause SELECT et y fait référence dans la clause GROUP BY.

    USE AdventureWorks2008R2;
    GO
    SELECT DATEPART(yyyy,OrderDate) AS Year, SUM(TotalDue) AS Total
    FROM Sales.SalesOrderHeader
    GROUP BY Year;
    

    En raison de l'ordre dans lequel les clauses de requête sont logiquement traitées, l'exemple retourne l'erreur 207. L'ordre de traitement est le suivant :

    1. FROM

    2. ON

    3. JOIN

    4. WHERE

    5. GROUP BY

    6. WITH CUBE ou WITH ROLLUP

    7. HAVING

    8. SELECT

    9. DISTINCT

    10. ORDER BY

    11. TOP

    Étant donné qu'un alias de colonne n'est pas défini tant que la clause SELECT n'est pas traitée, le nom d'alias est inconnu lorsque la clause GROUP BY est traitée.

  • L'instruction MERGE génère cette erreur lorsque la clause <merge_matched> fait référence à des colonnes dans la table source mais qu'aucune ligne n'est retournée par la table source dans la clause WHEN NOT MATCHED BY SOURCE. L'erreur se produit car les colonnes dans la table source sont inaccessibles lorsque aucune ligne n'est retournée à la requête. Par exemple, la clause WHEN NOT MATCHED BY SOURCE THEN UPDATE SET TargetTable.Col1 = SourceTable.Col1 peut faire en sorte que l'instruction échoue si Col1 dans la table source est inaccessible.

Action de l'utilisateur

Vérifiez les informations suivantes et corrigez l'instruction comme il convient.

  • Le nom de colonne existe dans la table et il est correctement orthographié. L'exemple suivant interroge l'affichage catalogue sys.columns pour retourner tous les noms de colonnes pour une table donnée.

    SELECT name FROM sys.columns WHERE object_id = OBJECT_ID('schema_name.table_name');
    
  • Respect de la casse du classement de base de données. L'instruction suivante retourne le classement de la base de données spécifiée.

    SELECT collation_name FROM sys.databases WHERE name = 'database_name';
    

    L'abréviation CS dans le nom du classement indique que celui-ci respecte la casse. Par exemple, Latin1_General_CS_AS indique un classement qui respecte la casse et les accents. Modifiez le nom de colonne de sorte qu'il corresponde au nom de colonne tel que défini dans la table.

  • Un alias de colonne est référencé de manière incorrecte. Modifiez l'instruction en répétant l'expression qui définit l'alias dans la clause appropriée ou en utilisant une table dérivée. L'exemple suivant répète les expressions qui définissent l'alias Year dans la clause GROUP BY.

    USE AdventureWorks2008R2;
    GO
    SELECT DATEPART(yyyy,OrderDate) AS Year ,SUM(TotalDue) AS Total
    FROM Sales.SalesOrderHeader
    GROUP BY DATEPART(yyyy,OrderDate);
    

    L'exemple suivant utilise une table dérivée pour rendre le nom d'alias accessible à d'autres clauses dans la requête. Notez que l'alias Year est défini dans la clause FROM, qui est traitée en premier, ce qui rend l'alias accessible pour une utilisation dans d'autres clauses de la requête.

    USE AdventureWorks2008R2;
    GO
    SELECT d.Year, SUM(TotalDue) AS Total
    FROM (SELECT DATEPART(yyyy,OrderDate) AS Year, TotalDue
          FROM Sales.SalesOrderHeader)AS d
    GROUP BY Year;
    
  • La clause WHEN NOT MATCHED BY SOURCE de l'instruction MERGE fait référence à une valeur accessible. Modifiez l'instruction MERGE de façon qu'une ligne au moins soit retournée par la table source dans la clause WHEN NOT MATCHED BY SOURCE. Par exemple, vous devrez peut-être ajouter ou modifier le critère de recherche spécifié pour la clause. Vous pouvez aussi modifier la clause de façon à spécifier une valeur qui ne fait pas référence à la table source. Par exemple, WHEN NOT MATCHED BY SOURCE THEN UPDATE SET TargetTable.Col1 = <expression, or other available value>.