SQL Server CTE语句何时执行
这可能是一个有点愚蠢的问题,但我只想检查SQL Server CTE语句何时执行,sql,view,common-table-expression,Sql,View,Common Table Expression,这可能是一个有点愚蠢的问题,但我只想检查WITH语句何时触发。这可能最好通过一个例子来描述。我们在底部看到了风景 该视图从XML节点提取所需的信息,以便于在报告、屏幕等上显示。。。我们将只调用传递日期范围或表名的视图 我的问题是,当这个观点被称为 select * from [Core].[vw_DBAudit] where TableName = 'CorporateActions' WITH语句是否仅对TableName='CorporateActions'的记录运行,还是对所有记录
WITH
语句何时触发。这可能最好通过一个例子来描述。我们在底部看到了风景
该视图从XML节点提取所需的信息,以便于在报告、屏幕等上显示。。。我们将只调用传递日期范围或表名的视图
我的问题是,当这个观点被称为
select *
from [Core].[vw_DBAudit]
where TableName = 'CorporateActions'
WITH
语句是否仅对TableName='CorporateActions'
的记录运行,还是对所有记录运行。也就是说,它将删除表中所有记录的XML节点,还是仅针对tablename='CorporateActions'
中的记录?我担心的是它做的工作比它需要的要多。如果它将对所有记录运行,那么我将删除WITH
语句,并将其编码为select。这段代码是由其他人编写的,所以我想在返回之前确认一下
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
在查询分析器确定查询计划之前,它会展开视图和CTE。使用CTE编写查询不会影响查询的运行方式。您可以通过查看执行计划来检查这一点。如果
TableName
上的过滤器是在分解XML之前完成的,这一点应该很明显。我的猜测是,它是过滤之前,但你必须检查计划,以确保。