Ao ler esta limitação de comprimento de caractere LIKE aqui, parece que não consigo enviar um texto com mais de ~ 4000 caracteres em uma cláusula LIKE.
Estou tentando buscar o plano de consulta do cache do plano de consulta para uma consulta específica.
SELECT *
FROM sys.dm_exec_cached_plans AS cp
CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) AS qp
CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) AS st
where st.text like '%MY_QUERY_LONGER_THAN_4000_CHARS%' ESCAPE '?'
se a consulta dentro do LIKE
arquivo for maior que 4000 caracteres, obterá 0 resultado, mesmo que minha consulta esteja no plano de cache. (Eu estava esperando pelo menos um erro).
Existe uma maneira de solucionar esse problema ou fazer diferente? Tenho consultas que podem ser 10000
longas > e parece que não consigo encontrá-las com o LIKE
.
sql-server
t-sql
sql-server-2016
like
Dan Dinu
fonte
fonte
where st.text like '%MY_QUERY%CHARS%' ESCAPE '?'
Respostas:
Parece que isso não pode ser resolvido no T-SQL puro, pois
CHARINDEX
nemPATINDEX
permite o uso de mais de 8000 bytes na string "procurar" (ou seja, no máximo 8000VARCHAR
ou 4000NVARCHAR
caracteres). Isso pode ser visto nos seguintes testes:Ambas as consultas retornam o seguinte erro:
Além disso, reduzir o número
7000
de consultas para3999
eliminar o erro. Um valor de4000
ambos os casos também apresentará erro (devido aoN'Z'
caractere extra no início).No entanto, isso pode ser feito usando o SQLCLR. É bastante simples criar uma função escalar que aceite dois parâmetros de entrada do tipo
NVARCHAR(MAX)
.O exemplo a seguir ilustra essa capacidade usando a versão gratuita do biblioteca SQL # SQLCLR (que eu criei, mas String_Contains está novamente disponível na versão Free :-).
O UDF escalar String_Contains atualmente possui o
@SearchValue
parâmetro de entrada como emNVARCHAR(4000)
vez deNVARCHAR(MAX)
(I não deve ter pensado que as pessoas estariam procurando por cordas de mais de 4000 caracteres ;-) mas isso é muito fácil de mudança, fazendo a seguinte alteração de uma só vez (depois de SQL # foi instalado, é claro):CONFIGURAÇÃO
TESTES
Lembre-se de que String_Contains está usando uma comparação sensível a tudo (maiúsculas e minúsculas, acento, Kana e largura).
fonte
Como você também solicitou abordagens alternativas, outra maneira de encontrar um plano específico é procurá-lo
plan_hash
, alterando sua consulta da seguinte maneira:A maneira mais rápida que encontrei para obter o
QueryHash
valor a pesquisar é colar a consulta em questão em uma janela de consulta e exibir o plano de execução estimado. Leia a saída XML e procure oQueryHash
atributo noStmtSimple
elemento, e isso deve fornecer o que você precisa. Conecte o valor QueryHash na consulta acima e esperamos que você tenha o que procura.Aqui estão algumas capturas de tela mostrando como obter rapidamente o
QueryHash
valor, caso eu esteja explicando mal.Exibir plano de execução estimado
Mostrar plano de execução XM ...
Pesquisar valor QueryHash
Obviamente, o truque não funcionará se a consulta que você procura for diferente da consulta para a qual você está exibindo o Plano de Execução Estimado, mas isso pode ser mais rápido do que todas as nuances que acompanham as rotinas CLR e fazem com que elas funcionem corretamente.
fonte
Se você tiver acesso aos textos da consulta (o que significa que pode modificá-los), poderá adicionar comentários exclusivos àqueles em que estiver interessado:
em seguida, procure
myUniqueQuery123
no cache do plano em vez do texto inteiro da consulta:PS. Não testado
fonte