Eu tenho este XQuery para minha sessão de evento estendida que funciona bem, mas quando tento ingressar no plan_handle para dm_exec_query_plan para obter o plano de consulta, ele diz
Msg 257, Nível 16, Estado 3, Linha 1 A conversão implícita do tipo de dados varchar para varbinary não é permitida. Use a função CONVERT para executar esta consulta.
Se eu converter para varbinary, este é o erro que recebo.
"Msg 569, Nível 16, Estado 5, Linha 1 O identificador passado para dm_exec_query_plan era inválido."
Se eu passar manualmente o identificador para o DMF, ele funcionará bem. É assim que fica no formato varchar (depois de adicionar o 0x)
0x06000700f9971028f01033ae030000000100000000000000000000000000000000000000000000000000000000
SELECT
q.Time
,q.[CPU (ms)]
,q.[Duration (s)]
,q.[SQL Statement]
,q.plan_handle
FROM (
SELECT
data.value( '(/event[@name="sql_statement_completed"]/@timestamp)[1]', 'DATETIME') AS [Time]
,data.value( '(/event/data[@name=''cpu'']/value)[1]', 'INT') AS [CPU (ms)]
,CONVERT(float, data.value('(/event/data[@name="duration"]/value)[1]', 'BIGINT')) / 1000000
AS [Duration (s)]
,data.value(
'(/event/action[@name=''sql_text'']/value)[1]', 'VARCHAR(MAX)') AS [SQL Statement]
--,data.value('(/event/action[@name=''plan_handle'']/value)[1]', 'varchar(4000)') AS [PlanHandle]
,'0x' + CAST(data.value('(/event/action[@name="plan_handle"]/value)[1]', 'varchar(4000)') AS varchar(4000)) AS plan_handle
FROM (
SELECT
CONVERT(xml, event_data) AS data
FROM sys.fn_xe_file_target_read_file
('H:\SQLskills\EE_ExpensiveQueries*.xel', 'H:\SQLskills\EE_ExpensiveQueries*.xem', NULL, NULL)
) entries
)q
CROSS APPLY sys.dm_exec_query_plan(plan_handle)
Isso ainda é uma string, independentemente de como parece para você quando você copia a saída:
Tente usar um parâmetro de estilo no
CONVERT
, para que a string não seja convertida em uma representação binária da string, mas sim convertida no valor binário literal da string: