这可能是一个愚蠢的问题,但我只是想准确检查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