Wenn ich diese Einschränkung der LIKE-Zeichenlänge hier lese , kann ich anscheinend keinen Text senden, der länger als ~ 4000 Zeichen in einer LIKE-Klausel ist.
Ich versuche, den Abfrageplan für eine bestimmte Abfrage aus dem Abfrageplan-Cache abzurufen.
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 '?'
Wenn die Abfrage in der LIKE
länger als 4000 Zeichen ist, erhalte ich 0 Ergebnisse, auch wenn sich meine Abfrage im Cache-Plan befindet. (Ich hatte zumindest einen Fehler erwartet).
Gibt es eine Möglichkeit, dieses Problem zu umgehen oder es anders zu machen? Ich habe Anfragen, die> 10000
Zeichen lang sein können, und es sieht so aus, als ob ich sie mit der nicht finden kann LIKE
.
sql-server
t-sql
sql-server-2016
like
Dan Dinu
quelle
quelle
where st.text like '%MY_QUERY%CHARS%' ESCAPE '?'
Antworten:
Es scheint nicht möglich zu sein, dies in reinem T-SQL zu lösen, da weder
CHARINDEX
nochPATINDEX
erlauben für die Verwendung von mehr als 8000 Bytes in der Zeichenfolge (dh max von 8000 „suchen“VARCHAR
oder 4000NVARCHAR
Zeichen). Dies zeigt sich in folgenden Tests:Beide Abfragen geben den folgenden Fehler zurück:
Reduzieren Sie den Wert
7000
in einer dieser Abfragen,3999
um den Fehler zu beheben. Ein Wert von4000
in beiden Fällen wird ebenfalls fehlerhaft (aufgrund des zusätzlichenN'Z'
Zeichens am Anfang).Dies kann jedoch mit SQLCLR erreicht werden. Es ist ziemlich einfach, eine Skalarfunktion zu erstellen, die zwei Eingabeparameter vom Typ akzeptiert
NVARCHAR(MAX)
.Das folgende Beispiel veranschaulicht diese Möglichkeit mit der kostenlosen Version der SQL # SQLCLR-Bibliothek (die ich erstellt habe, aber String_Contains ist in der kostenlosen Version wieder verfügbar :-).
Die String_Contains skalare UDF hat zur Zeit den
@SearchValue
Eingang param alsNVARCHAR(4000)
stattNVARCHAR(MAX)
(ich muss nicht gedacht haben Menschen auf der Suche würde für Strings von über 4000 Zeichen ;-) , aber das ist sehr einfach zu ändern , indem Sie die folgende einmalige Änderung vorgenommen (nach SQL # wurde natürlich installiert):INSTALLIEREN
TESTS
Beachten Sie, dass String_Contains einen allsensitiven Vergleich (Groß- / Kleinschreibung, Akzent, Kana und Breite) verwendet.
quelle
Da Sie auch nach alternativen Ansätzen gefragt haben, können Sie einen bestimmten Plan auch suchen
plan_hash
, indem Sie Ihre Abfrage wie folgt ändern:Der schnellste Weg, den ich gefunden habe, um den
QueryHash
zu suchenden Wert zu erhalten, besteht darin, die betreffende Abfrage in ein Abfragefenster einzufügen und dann den geschätzten Ausführungsplan anzuzeigen. Lesen Sie die XML-Ausgabe und suchen Sie nachQueryHash
Attribut imStmtSimple
Element. Dies sollte Ihnen das geben, was Sie benötigen. Fügen Sie den QueryHash-Wert in die obige Abfrage ein, und Sie sollten hoffentlich das haben, wonach Sie suchen.Hier sind einige Screenshots, die zeigen, wie Sie das schnell bekommen
QueryHash
Wert falls ich ihn schlecht erkläre.Geschätzten Ausführungsplan anzeigen
Ausführungsplan XM anzeigen ...
Suchen Sie nach QueryHash Value
Offensichtlich funktioniert der Trick nicht, wenn sich die gesuchte Abfrage von der Abfrage unterscheidet, für die Sie den geschätzten Ausführungsplan anzeigen. Dies ist jedoch möglicherweise schneller als all die Nuancen, die mit CLR-Routinen einhergehen und deren ordnungsgemäße Funktionsweise sicherstellen.
quelle
Wenn Sie Zugriff auf die Abfragetexte haben (dh Sie können sie ändern), können Sie denjenigen, die Sie interessieren, eindeutige Kommentare hinzufügen:
Suchen Sie dann
myUniqueQuery123
im Plan-Cache nach anstelle des gesamten Abfragetexts:PS. Nicht getestet
quelle