KB2322209-FIX: SQL Server 2008에서 공통 테이블 식이 있는 문에서 SELECT를 괄호를 사용 하면 잘못 된 결과가 반환 됨

증상

Microsoft SQL Server 2008를 실행 하는 컴퓨터에서 다음 시나리오를 고려 합니다.

시나리오 1

WITH 문을 사용 하 여 CTE (공통 테이블 식)를 지정 합니다. 예를 들어 다음 쿼리를 실행 합니다.

WITH common_table_expression AS (SELECT * FROM sys.objects)(SELECT * FROM common_table_expression)

그런 다음이 쿼리를 실행 합니다.

SELECT *FROM sys.dm_exec_query_statsWHERE statement_start_offset > statement_end_offsetANDstatement_end_offset <> -1

이 시나리오에서는이 쿼리에 대해 캐시 된 쿼리 계획이 잘못 된 statement_start_offset 및 statement_end_offset 값을 저장 합니다. 특히, sys.dm_exec_query_stats DMV (동적 관리 뷰)를 실행할 때 statement_end_offset 값이 statement_start_offset 값 보다 작습니다. 이 문제 때문에 보고서에서 statement_start_offset 값이 항상 statement_stop_offset 값 보다 작은 것으로 가정 하면 성능 보고서가 실패할 수 있습니다.

시나리오 2

WITH 문을 사용 하 여 공통 테이블 식을 지정 하 고 RECOMPILE 옵션을 사용 합니다. 예를 들어 다음 스크립트를 사용 하 여 SQL Server 2008에서 함수를 만듭니다.

CREATE FUNCTION function1() RETURNS int ASBEGINDECLARE @x intSET @x=1;WITH common_table_expression AS (SELECT @x AS column1) (SELECT @x=column1 FROM common_table_expression) OPTION(RECOMPILE)RETURN @xEND

"Function1 ()" 쿼리를 실행 하면 다음과 같은 오류 메시지가 나타납니다.

현재 명령에 심각한 오류가 발생 했습니다. 결과가 있으면 삭제 해야 합니다.

또한이 오류는 SQL server에 서버 트래픽이 많은 경우 다시 컴파일 옵션을 사용 하지 않고 발생할 수 있습니다.

시나리오 3

WITH 문을 사용 하 여 공통 테이블 식을 지정 합니다. WITH 문에서 존재 하지 않는 테이블을 지정 합니다. 예를 들어 다음 쿼리를 실행 합니다.

WITH computed_table (id) AS(SELECT id FROM this_table_does_not_exist) (SELECT id FROM dbo.computed_table) GO

이 쿼리를 실행 하면 누락 된 테이블에 대 한 오류가 표시 되지 않습니다.

원인

이러한 문제는 WITH 문 다음에 오는 SELECT 문이 제대로 처리 되지 않기 때문에 발생 합니다. WITH 문은 다음 구문을 사용 합니다.

WITH common_table_expression AS(CTE_query_definition)

그런 다음이 문은 지정 된 공통 테이블 식 이름에 할당 된 결과 집합을 만듭니다. 그런 다음 SELECT 문으로이 명령문을 팔 로우 합니다. 이 두 번째 문이 괄호로 묶여 있고, 결과에 대 한 작업을 수행 하거나, 동적 관리 보기 sys.dm_exec_query_stats를 실행 하려고 하면 잘못 된 결과가 나타나거나 오류가 발생 합니다.

해결 방법

서비스 팩 정보 이 문제를 해결 하려면 SQL Server 2008의 최신 서비스 팩을 구하십시오. 자세한 내용을 확인하려면 다음 문서 번호를 클릭하여 Microsoft 기술 자료 문서를 참조하십시오.

968382 SQL Server 2008의 최신 서비스 팩을 구하는 방법

해결 방법

이러한 문제를 해결 하려면 공용 테이블 식을 따르는 문에서 괄호를 제거 해야 합니다. 예를 들어 이러한 괄호를 사용 하는 다음과 같은 문을 고려해 보겠습니다.

WITH common_table_expression AS (SELECT *FROM sys.objects)(SELECT * FROM common_table_expression)

이러한 문제를 해결 하려면 괄호를 사용 하지 않는 다음과 같은 문으로 변경 합니다.

WITH common_table_expression AS (SELECT *FROM sys.objects)SELECT * FROM common_table_expressio

상태

Microsoft는 "적용 대상" 섹션에 나열 된 Microsoft 제품의 문제를 확인 했습니다. 이 문제는 SQL Server 2008 서비스 팩 2 (SP2)에서 처음 수정 되었습니다.

추가 정보

공통 테이블 식과 함께 WITH 문을 사용 하는 방법에 대 한 자세한 내용은 다음 MSDN 웹 페이지를 참조 하세요.

T-sql (common_table_expression)Sys.dm_exec_query_stats에 대 한 자세한 내용을 보려면 다음 MSDN 웹 페이지를 방문 하세요.

t-sql (sys.dm_exec_query_stats)

추가 도움이 필요하신가요?

기술 향상
교육 살펴보기
새로운 기능 우선 가져오기
Microsoft Insider 참가

이 정보가 유용한가요?

소중한 의견에 감사드립니다.

피드백을 주셔서 감사합니다. Office 지원 에이전트와 연락하는 것이 도움이 될 것 같습니다.

×