Al leer esta limitación de longitud de caracteres LIKE aquí, parece que no puedo enviar un texto de más de ~ 4000 caracteres en una cláusula LIKE.
Estoy tratando de obtener el plan de consulta del caché del plan de consulta para una consulta en particular.
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 '?'
si la consulta dentro de the LIKE
es más larga que 4000 caracteres, entonces obtengo 0 resultados incluso si mi consulta está en el plan de caché. (Esperaba al menos un error).
¿Hay alguna forma de solucionar este problema o hacerlo de manera diferente? Tengo consultas que pueden ser> 10000
caracteres largos y parece que no puedo encontrarlas con el LIKE
.
sql-server
t-sql
sql-server-2016
like
Dan Dinu
fuente
fuente
where st.text like '%MY_QUERY%CHARS%' ESCAPE '?'
Respuestas:
No parece que esto pueda resolverse en T-SQL puro ya que
CHARINDEX
niPATINDEX
permite usar más de 8000 bytes en la cadena "para buscar" (es decir, un máximo de 8000VARCHAR
o 4000NVARCHAR
caracteres). Esto se puede ver en las siguientes pruebas:Ambas consultas devuelven el siguiente error:
Y, al reducir la consulta
7000
en cualquiera de esas consultas,3999
se elimina el error. Un valor de4000
en ambos casos también producirá un error (debido alN'Z'
carácter adicional al principio).SIN EMBARGO, esto se puede lograr usando SQLCLR. Es bastante simple crear una función escalar que acepte dos parámetros de entrada de tipo
NVARCHAR(MAX)
.El siguiente ejemplo ilustra esta capacidad usando la versión gratuita de la biblioteca SQL # SQLCLR (que creé, pero String_Contains está nuevamente disponible en la versión gratuita :-).
Los String_Contains escalares UDF tiene actualmente el
@SearchValue
parámetro de entrada comoNVARCHAR(4000)
en lugar deNVARCHAR(MAX)
(No debe haber pensado que la gente estaría buscando para cadenas de más de 4000 caracteres ;-), pero que es muy fácil cambiar al hacer el siguiente cambio de una sola vez (después de SQL # ha sido instalado, por supuesto):PREPARAR
PRUEBAS
Tenga en cuenta que String_Contains está utilizando una comparación sensible a todo (mayúsculas, acento, Kana y ancho).
fuente
Debido a que también solicitó enfoques alternativos, otra forma de encontrar un plan específico es buscarlo
plan_hash
, alterando su consulta de la siguiente manera:La forma más rápida que he encontrado para obtener el
QueryHash
valor para buscar es pegar la consulta en cuestión en una ventana de consulta y luego mostrar el plan de ejecución estimado. Lea la salida XML y busque elQueryHash
atributo en elStmtSimple
elemento y esto debería darle lo que necesita. Conecte el valor de QueryHash en la consulta anterior y esperemos que tenga lo que está buscando.Aquí hay algunas capturas de pantalla que muestran cómo obtener rápidamente el
QueryHash
valor en caso de que lo explique mal.Visualizar plan de ejecución estimado
Mostrar plan de ejecución XM ...
Buscar valor de QueryHash
Obviamente, el truco no funcionará si la consulta que está buscando difiere de la consulta para la que está mostrando el Plan de ejecución estimado, pero esto puede ser más rápido que todos los matices que vienen con las rutinas CLR y hacer que funcionen correctamente.
fuente
Si tiene acceso a los textos de consulta (lo que significa que puede modificarlos), puede agregar comentarios únicos a aquellos que le interesan:
luego busque
myUniqueQuery123
en la caché del plan en lugar del texto completo de la consulta:PD. No probado
fuente