De acordo com a documentação, a coluna retornada timestamp_utc
deve ser do tipo datetime2(7)
Mas quando eu consulto assim
SELECT
*
FROM sys.fn_xe_file_target_read_file('system_health*.xel', null, null, null)
WHERE timestamp_utc > dateadd(hour, -1, GETUTCDATE())
Não retorna nenhuma linha. Ele retorna as linhas somente quando eu adiciono um cast explícito para 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())
Que corresponde ao último exemplo na documentação (mesmo que nenhuma atenção seja dada a ele)
Por que é que?
Erland Sommarskog me perguntou sobre isso em maio de 2022.
É um bug exposto quando um predicado é enviado para a função com valor de tabela de streaming interno. O tipo de retorno é de fato,
datetime2(7)
mas a fonte é um WindowsFILETIME
.O predicado é empurrado abaixo da conversão interna, então o servidor acaba tentando comparar a
datetime2
com aFILETIME
, o que não funciona.Predicado empurrado para baixo
Quando você adiciona a conversão explícita, o predicado não pode mais ser inserido no TVF, portanto, ele aparece como um filtro separado:
Predicado avaliado em um filtro separado
Não tenho ideia de por que isso não foi corrigido.
Erland posteriormente criou um item de feedback: Filtrar a saída de fn_xe_file_target_read_file em timestamp_utc não retorna nenhuma linha