根据文档,返回的列timestamp_utc
应为datetime2(7)类型
但是当我这样查询时
SELECT
*
FROM sys.fn_xe_file_target_read_file('system_health*.xel', null, null, null)
WHERE timestamp_utc > dateadd(hour, -1, GETUTCDATE())
它不返回任何行。它仅在我向datetime2添加显式强制转换时才返回行
SELECT
*
FROM sys.fn_xe_file_target_read_file('system_health*.xel', null, null, null)
WHERE cast(timestamp_utc as datetime2(7)) > dateadd(hour, -1, GETUTCDATE())
与文档中的最后一个示例相匹配(即使没有引起注意)
这是为什么?
Erland Sommarskog 在 2022 年 5 月问过我这个问题。
这是在将谓词下推到内部流式表值函数时暴露的错误。返回类型确实是
datetime2(7)
,但来源是 WindowsFILETIME
。谓词被下推到内部转换之下,因此服务器最终尝试将 a
datetime2
与 a进行比较FILETIME
,但这是行不通的。下推谓词
当您添加显式转换时,谓词不能再被推入 TVF,因此它显示为一个单独的过滤器:
在单独的过滤器中评估谓词
我不知道为什么这没有得到解决。
Erland 随后创建了一个反馈项:Filtering output from fn_xe_file_target_read_file on timestamp_utc returns no rows