MSSQLSERVER_207

適用対象:SQL Server

詳細

属性
製品名 SQL Server
イベント ID 207
イベント ソース MSSQLSERVER
コンポーネント SQLEngine
シンボル名 SQ_BADCOL
メッセージ テキスト 列名 '%.*ls' が無効です。

説明

このクエリ エラーは次のいずれかの問題が原因で生じている可能性があります。

  • 列名にスペルミスがあるか、指定されたテーブルにその列が存在しません。

  • データベースの照合順序で大文字と小文字が区別され、クエリで指定された列名の大文字と小文字がテーブルで定義された列のものと一致していません。 たとえば、データベースの照合順序で大文字と小文字が区別され、テーブルで列が LastName と定義されている場合、クエリで Lastname または lastname と指定してその列を参照すると、エラー 207 が返されます。これは列名が一致しないためです。

  • 列の別名 (SELECT 句で定義) が、WHERE、GROUP BY 句などの別の句で参照されています。 たとえば、次のクエリでは SELECT 句で列の別名 Year が定義されており、GROUP BY 句で参照されています。

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

    クエリの各句が論理的に処理される順序に基づいて、この例ではエラー 207 が返されます。 この処理の順序は次のとおりです。

    1. FROM

    2. ON

    3. JOIN

    4. WHERE

    5. GROUP BY

    6. WITH CUBE または WITH ROLLUP

    7. HAVING

    8. SELECT

    9. DISTINCT

    10. ORDER BY

    11. TOP

    列の別名は SELECT 句が処理されるまでは定義されないため、GROUP BY 句が処理される時点では別名が不明になってしまいます。

  • MERGE ステートメントは、merge_matched> 句がソース テーブル内の<列を参照しているが、WHEN NOT MATCHED BY SOURCE 句のソース テーブルから行が返されない場合に、このエラーを発生させます。 このエラーは、クエリに行が返されないと、ソース テーブルの列にアクセスできないために発生します。 たとえば、ソース テーブルの WHEN NOT MATCHED BY SOURCE THEN UPDATE SET TargetTable.Col1 = SourceTable.Col1 にアクセスできないと、Col1 句によってステートメントが失敗することになります。

ユーザーの操作

次の情報を確認し、必要に応じてステートメントを修正します。

  • 列名がテーブルに存在し、スペルも正しい。 次の例では sys.columns カタログ ビューに対するクエリが実行され、指定されたテーブルのすべての列名が返されます。

    SELECT name FROM sys.columns WHERE object_id = OBJECT_ID('schema_name.table_name');  
    
  • データベースの照合順序で大文字と小文字が区別されるかどうか。 次のステートメントでは、指定されたデータベースの照合順序が返されます。

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

    照合順序名に含まれる省略形 CS は、照合順序で大文字と小文字が区別されることを示します。 たとえば、Latin1_General_CS_AS は、大文字と小文字およびアクセントが区別される照合順序です。 テーブルで定義されている列名の大文字と小文字に一致するように、列名を変更してください。

  • 列の別名が不適切に参照されている。 適切な句の中で、別名を定義する式を再度記述するか、派生テーブルを使って、ステートメントを変更してください。 次の例では、GROUP BY 句の中で、別名 Year を定義する式を再度記述しています。

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

    次の例では、派生テーブルを使って、別名をクエリ内の他の句でも使用できるようにしています。 別名 Year は FROM 句内で定義されており、これが最初に処理されるため、この別名はクエリ内の他の句でも使用できるようになります。

    USE AdventureWorks2022;  
    GO  
    SELECT d.Year, SUM(TotalDue) AS Total  
    FROM (SELECT DATEPART(yyyy,OrderDate) AS Year, TotalDue  
          FROM Sales.SalesOrderHeader)AS d  
    GROUP BY Year;  
    
  • MERGE ステートメントの WHEN NOT MATCHED BY SOURCE 句が、アクセスできる値を参照している。 WHEN NOT MATCHED BY SOURCE 句でソース テーブルから少なくとも 1 行が返されるように MERGE ステートメントを変更します。 たとえば、この句に指定した検索条件を追加または変更する必要があります。 または、句を変更して、ソース テーブルを参照しない値を指定します。 たとえば、「 WHEN NOT MATCHED BY SOURCE THEN UPDATE SET TargetTable.Col1 = <expression, or other available value> 」のように入力します。

参照

MERGE (Transact-SQL)
FROM (Transact-SQL)
SELECT (Transact-SQL)
UPDATE (Transact-SQL)