MSSQLSERVER_207

적용 대상:SQL Server

세부 사항

attribute
제품 이름 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. 켜기

    3. JOIN

    4. WHERE

    5. GROUP BY

    6. WITH CUBE 또는 WITH ROLLUP

    7. HAVING

    8. SELECT

    9. DISTINCT

    10. ORDER BY

    11. 맨 위로 이동

    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 절의 원본 테이블에서 하나 이상의 행이 반환되도록 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)