我有这个 XQuery 用于我的扩展事件会话,它工作正常但是当我尝试将 plan_handle 加入 dm_exec_query_plan 以获取查询计划时,它说
消息 257,级别 16,状态 3,第 1 行不允许从数据类型 varchar 到 varbinary 的隐式转换。使用 CONVERT 函数运行此查询。
如果我转换为 varbinary,这就是我收到的错误。
“消息 569,级别 16,状态 5,第 1 行传递给 dm_exec_query_plan 的句柄无效。”
如果我手动将句柄传递给 DMF,它就可以正常工作。这是它在 varchar 格式中的样子(添加 0x 之后)
0x06000700f9971028f01033ae030000000100000000000000000000000000000000000000000000000000000
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)
这仍然是一个字符串,无论您复制输出时它看起来如何:
尝试在 上使用样式参数
CONVERT
,这样字符串就不会转换为字符串的二进制表示形式,而是转换为字符串的文字二进制值: