【问题标题】:When does SQL Server CTE statement executeSQL Server CTE 语句何时执行
【发布时间】:2013-06-17 03:28:17
【问题描述】:

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

视图从 XML 节点中提取所需的信息,以便更容易地在报告、屏幕等上显示...我们只会在传递日期范围或表名的情况下调用此视图。

我的问题是,当这个视图被称为 ...

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

WITH 语句将仅对具有TableName = 'CorporateActions' 的记录运行还是对所有记录运行。 IE。它会去除表中所有记录的 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

【问题讨论】:

  • 您可以通过查看执行计划来检查。如果TableName 上的过滤器是在分解 XML 之前完成的,这应该很明显。我的猜测会是它之前被过滤过,但你必须检查计划以确保。

标签: sql view common-table-expression


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    • 2017-09-14
    • 1970-01-01
    • 2018-03-20
    • 1970-01-01
    • 1970-01-01
    • 2014-10-25
    相关资源
    最近更新 更多