1

这可能是一个愚蠢的问题,但我只是想准确检查WITH语句何时触发。这可能最好通过一个例子来描述。我们在底部有视图。

该视图从 XML 节点中提取所需的信息,以便更容易地显示在报告、屏幕等上……我们只会调用这个视图,传入一个日期范围或一个表名。

我的问题是,当这种观点被称为......

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
4

1 回答 1

3

在查询分析器确定查询计划之前,它会展开视图和 CTE。使用 CTE 编写查询不会影响查询的运行方式。

于 2013-06-17T04:51:12.530 回答