En lisant cette limitation de longueur de caractères LIKE ici, il semble que je ne puisse pas envoyer un texte de plus de ~ 4000 caractères dans une clause LIKE.
J'essaie de récupérer le plan de requête dans le cache du plan de requête pour une requête particulière.
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 requête à l'intérieur de la LIKE
est plus longue que 4000 caractères, j'obtiens 0 résultat même si ma requête est dans le plan de cache. (Je m'attendais à au moins une erreur).
Existe-t-il un moyen de contourner ce problème ou de le faire différemment? J'ai des requêtes qui peuvent être> 10000
longues et il semble que je ne puisse pas les trouver avec le LIKE
.
sql-server
t-sql
sql-server-2016
like
Dan Dinu
la source
la source
where st.text like '%MY_QUERY%CHARS%' ESCAPE '?'
Réponses:
Il ne semble pas que cela puisse être résolu en T-SQL pur car
CHARINDEX
niPATINDEX
autoriser ni utiliser plus de 8000 octets dans la chaîne "à rechercher" (c'est-à-dire max de 8000VARCHAR
ou 4000NVARCHAR
caractères). Cela peut être vu dans les tests suivants:Ces deux requêtes renvoient l'erreur suivante:
Et, la réduction de l'une
7000
ou l'autre de ces requêtes pour3999
éliminer l'erreur. Une valeur de4000
dans les deux cas entraînera également une erreur (en raison duN'Z'
caractère supplémentaire au début).CEPENDANT, cela peut être accompli en utilisant SQLCLR. Il est assez simple de créer une fonction scalaire qui accepte deux paramètres d'entrée de type
NVARCHAR(MAX)
.L'exemple suivant illustre cette capacité en utilisant la version gratuite du bibliothèque SQL # SQLCLR (que j'ai créée, mais String_Contains est à nouveau disponible dans la version gratuite :-).
L' UDF scalaire String_Contains a actuellement le paramètre d'
@SearchValue
entrée auNVARCHAR(4000)
lieu deNVARCHAR(MAX)
(je ne dois pas avoir pensé que les gens chercheraient des chaînes de plus de 4000 caractères ;-) mais c'est très facile à changer en effectuant le changement unique suivant (après SQL # a été installé, bien sûr):INSTALLER
TESTS
Veuillez garder à l'esprit que String_Contains utilise une comparaison tout sensible (cas, accent, Kana et largeur).
la source
Parce que vous avez également demandé des approches alternatives, une autre façon de trouver un plan spécifique est de le rechercher
plan_hash
, en modifiant votre requête comme suit:Le moyen le plus rapide que j'ai trouvé pour obtenir la
QueryHash
valeur à rechercher est de coller la requête en question dans une fenêtre de requête, puis d'afficher le plan d'exécution estimé. Lisez la sortie XML et recherchez leQueryHash
attribut dans l'StmtSimple
élément et cela devrait vous donner ce dont vous avez besoin. Branchez la valeur QueryHash dans la requête ci-dessus et nous espérons que vous devriez avoir ce que vous recherchez.Voici quelques captures d'écran montrant comment obtenir rapidement
QueryHash
valeur au cas où je l'expliquerais mal.Afficher le plan d'exécution estimé
Afficher le plan d'exécution XM ...
Rechercher la valeur QueryHash
De toute évidence, l'astuce ne fonctionnera pas si la requête que vous recherchez diffère de la requête pour laquelle vous affichez le plan d'exécution estimé, mais cela peut être plus rapide que toutes les nuances fournies avec les routines CLR et les faire fonctionner correctement.
la source
Si vous avez accès aux textes de requête (ce qui signifie que vous pouvez les modifier), vous pouvez ajouter des commentaires uniques à ceux qui vous intéressent:
puis recherchez
myUniqueQuery123
dans le cache du plan au lieu du texte de requête entier:PS. Pas testé
la source