이것은 다소 바보 같은 질문 일 수 있습니다. 다만 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
실행 계획을 확인하여 확인할 수 있습니다. XML의 파쇄 전에'TableName '에있는 필터가 끝나면 분명해야합니다. 내 추측 * 그것은 전에 필터링 된 것입니다 그러나 당신은 확실히 계획을 확인해야합니다. –