这是与下面的查询非常相似的查询的执行计划,它给了我错误消息:
消息 6335,级别 16,状态 102,第 43 行 XML 数据类型实例的嵌套节点级别过多。允许的最大深度为 128 层。
SELECT *, cast(plantext as xml)
FROM [my_Safer_database].[dbo].[PS_PlanHistory]
where servername='IR1SH_server_SQL0014P0'
and procname='ManageInPlayEvents'
order by cachedtime desc
上表的定义是:
我知道问题与转换为 xml 有关,我该如何修复它或解决它?
预期结果示例:
Brent Ozar 在此讨论了这一点
你只需要使用
try_cast(plantext as xml)
.如果是这样,
NULL
那么您可以尝试plantext
从网格复制纯字符串并将其保存到扩展名为 .sqlplan 的文件中。不过,您可能会达到网格单元允许的字符数限制,而不会截断字符串。如果您确实达到了该限制或发现它有其他不方便,您也可以在初始之后添加此代码
SELECT
这将单独带回所有问题计划。列别名被 SSMS 视为 XML,即使在 SQL 中它是一个字符串。但这仅在结果集是单行/列时才有效。
我已验证此方法适用于 Brent 链接中的问题“SevenJoins”查询,并且执行计划在单击 XML 时显示良好。
为什么
XML_F52E2B61-18A1-11d1-B105-00805F49916B
?这是 SSMS 中的特殊情况,因为某些
FOR XML
查询用法确实依赖于它。该名称本身源自与 IXMLDocument Interface 关联的 GUID。不过我确实更喜欢这个
Microsoft SQL Server 2005 XML Showplan
名字。它不那么神秘,语义上更准确,SSMS 可以对此进行特殊处理,并可能将其视为展示计划。如果在 SSMS 中启用了实际执行计划选项,则带有 的计划
Microsoft SQL Server 2005 XML Showplan
可能会自动显示在执行计划选项卡中,而不是需要单击的网格中。就我自己而言,我发现这样做似乎比保罗回答中的
SELECT ... AS [Microsoft SQL Server 2005 XML Showplan]
直接方法更可靠地达到此目的。FETCH
当FETCH
直接 -ed 时,数据读取器有第二个隐藏列“ROWSTAT”,它破坏了 SSMS 是否应在计划选项卡中显示它的检查。如果这样做几乎肯定您会希望启动脚本以
SET STATISTICS XML OFF;
禁用当前脚本中与从其他地方检索到的脚本混合在一起的实际执行计划。另一种列名会欺骗 SSMS 使其认为字符串结果是 showplan:
布伦特的例子
解决方案
输出
每个计划都可以单击以显示完整的图形计划。