Este é o plano de execução de uma consulta muito parecida com a abaixo, e que me dá a mensagem de erro:
Msg 6335, Nível 16, Estado 102, Linha 43 A instância de tipo de dados XML tem muitos níveis de nós aninhados. A profundidade máxima permitida é de 128 níveis.
SELECT *, cast(plantext as xml)
FROM [my_Safer_database].[dbo].[PS_PlanHistory]
where servername='IR1SH_server_SQL0014P0'
and procname='ManageInPlayEvents'
order by cachedtime desc
a definição da tabela acima é:
Eu sei que o problema está relacionado à conversão para xml, como posso corrigi-lo ou contorná-lo?
Exemplo de resultados esperados:
Isso é discutido por Brent Ozar aqui
Você só precisa usar
try_cast(plantext as xml)
.Nesse caso,
NULL
você pode tentar copiar aplantext
string simples da grade e salvá-la em um arquivo com uma extensão .sqlplan. Você pode atingir o limite de número de caracteres que a célula da grade permitirá sem truncamento para strings também.Se você atingir esse limite ou achar que é inconveniente, você também pode adicionar este código após a inicial
SELECT
Isso trará de volta todos os planos de problemas individualmente. O alias da coluna é aquele que o SSMS trata como XML, embora no SQL seja uma string. Mas isso só funciona quando o conjunto de resultados é uma única linha/coluna.
Eu validei que esta abordagem funciona com o problema de consulta "SevenJoins" no link de Brent e o plano de execução exibe bem ao clicar no XML.
Por quê
XML_F52E2B61-18A1-11d1-B105-00805F49916B
?Isso é um caso especial no SSMS porque alguns usos de
FOR XML
consultas dependem dele. O próprio nome se origina de um GUID associado à interface IXMLDocument .Eu prefiro o
Microsoft SQL Server 2005 XML Showplan
nome embora. É menos enigmático, semanticamente mais preciso, e o SSMS pode fazer um caso especial disso e potencialmente tratá-lo como plano de execução.Se a opção do plano de execução real estiver habilitada no SSMS, haverá uma perspectiva de que os planos com o
Microsoft SQL Server 2005 XML Showplan
serão mostrados automaticamente na guia do plano de execução, em vez de em uma grade que precisa ser clicada.Para mim, descobri que fazer um
SELECT ... AS [Microsoft SQL Server 2005 XML Showplan]
parecia funcionar de forma mais confiável para esse propósito do que o diretoFETCH
na resposta de Paul. QuandoFETCH
-ed diretamente, o leitor de dados tem uma segunda coluna oculta "ROWSTAT" que interrompe a verificação que o SSMS faz para saber se deve ser exibida na guia do plano.Se fizer isso, quase certamente você deseja iniciar o script para
SET STATISTICS XML OFF;
desabilitar os planos de execução reais do script atual que está sendo misturado com os recuperados de outro lugar.Um nome de coluna alternativo enganando o SSMS fazendo-o pensar que o resultado da string é showplan:
exemplo de brent
Solução
Saída
Cada plano é clicável para mostrar o plano gráfico completo.