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 が返されます。 この処理の順序は次のとおりです。
FROM
ON
JOIN
WHERE
GROUP BY
WITH CUBE または WITH ROLLUP
HAVING
SELECT
DISTINCT
ORDER BY
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)