2013-06-17 1 views
0

이것은 다소 바보 같은 질문 일 수 있습니다. 다만 WITH 문이 실행되는시기를 정확하게 확인하려고했습니다. 이것은 아마도 예제를 통해 가장 잘 설명됩니다. 우리는 아래쪽에서 전망을 가지고 있습니다.SQL Server CTE 문은 언제 실행합니까

보기는 보고서, 화면 등에 쉽게 표시 할 수 있도록 XML 노드에서 필요한 정보를 추출합니다. 우리는 날짜 범위 또는 TableName을 전달하는이보기 만 호출합니다. 이 뷰는 다음과 같이 호출 내 질문은

, ...

select * 
from [Core].[vw_DBAudit] 
where TableName = 'CorporateActions' 

WITH 문은 TableName = 'CorporateActions'와 기록을 위해 실행하거나 모든 레코드에 대해 실행됩니다. 나는. 테이블의 모든 레코드에 대해 XML 노드를 제거 할 것인지 또는 tablename = 'CorporateActions'? 내 우려는 그것이 필요한 것보다 더 많은 일을하고 있다는 것이다. 모든 레코드에 대해 실행하면 WITH 문을 제거하고 선택으로 코딩합니다. 이 코드는 다른 사람이 작성하기 때문에 내가 그들에게 돌아 가기 전에 확실히하고 싶습니다.

CREATE VIEW [Core].[vw_DBAudit] 
AS 
WITH AuditTable 
AS 
(
SELECT 
    r.Actions 
    ,r.CreatedBy 
    ,r.WhenCreated 
    ,r.WhenModified 
    ,r.TableName 
    ,r.EntityKey 
    ,r.UserId 
    ,r.RevisionStamp 
    ,(SELECT u.UserName FROM aspnet_Users u WHERE u.UserId = r.UserId) AS UserName 
    ,a.changeddata.value('Property[1]', 'varchar(100)') AS Property 
    ,a.changeddata.value('OldValue[1]', 'varchar(100)') AS OldValue 
    ,a.changeddata.value('NewValue[1]', 'varchar(100)') AS NewValue 
    ,a.changeddata.value('(OldValue/@xsi:type)[1]','varchar(30)') AS OldValueDataType 
    ,a.changeddata.value('(NewValue/@xsi:type)[1]','varchar(30)') AS NewValueDataType 

FROM 
    Core.DBAudit r 
    cross apply r.[ChangedColumns].nodes('/ArrayOfModifiedProperty/ModifiedProperty') as a(changeddata) 
) 

SELECT 
    r.* 
    ,CASE WHEN r.OldValueDataType = 'xsd:dateTime' THEN   
      CONVERT(DATETIME, substring(r.OldValue,1,19)) 
    ELSE 
     null 
    END as 'OldDateValue'  
    ,CASE WHEN r.NewValueDataType = 'xsd:dateTime' THEN   
      CONVERT(DATETIME, substring(r.NewValue,1,19)) 
    ELSE 
     null 
    END as 'NewDateValue' 
FROM AuditTable r 
+1

실행 계획을 확인하여 확인할 수 있습니다. XML의 파쇄 전에'TableName '에있는 필터가 끝나면 분명해야합니다. 내 추측 * 그것은 전에 필터링 된 것입니다 그러나 당신은 확실히 계획을 확인해야합니다. –

답변

2

쿼리 분석기가 쿼리 계획을 결정하기 전에 뷰와 CTE를 모두 확장합니다. CTE가있는 쿼리를 작성해도 쿼리가 실행되는 방식에는 영향을 미치지 않습니다.