Po przeczytaniu tego ograniczenia długości LIKE tutaj wygląda na to, że nie mogę wysłać tekstu dłuższego niż ~ 4000 znaków w klauzuli LIKE.
Próbuję pobrać plan zapytań z pamięci podręcznej planu zapytań dla określonego zapytania.
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 '?'
jeśli zapytanie wewnątrz LIKE
jest dłuższe niż 4000 znaków, to otrzymuję 0 wyników, nawet jeśli moje zapytanie jest w planie pamięci podręcznej. (Spodziewałem się przynajmniej błędu).
Czy istnieje sposób obejścia tego problemu lub zrobienia tego inaczej? Mam zapytania, które mogą być> 10000
znakami i wygląda na to, że nie mogę ich znaleźć za pomocą LIKE
.
sql-server
t-sql
sql-server-2016
like
Dan Dinu
źródło
źródło
where st.text like '%MY_QUERY%CHARS%' ESCAPE '?'
Odpowiedzi:
Nie wydaje się, że można to rozwiązać w czystym języku T-SQL, ponieważ ani
CHARINDEX
niePATINDEX
pozwala na użycie więcej niż 8000 bajtów w ciągu „do wyszukiwania” (tj. Maksymalnie 8000VARCHAR
lub 4000NVARCHAR
znaków). Można to zobaczyć w następujących testach:Oba te zapytania zwracają następujący błąd:
Zmniejszając
7000
liczbę zapytań, aby3999
pozbyć się błędu. Wartość4000
w obu przypadkach również będzie błędna (z powodu dodatkowegoN'Z'
znaku na początku).JEDNAK można to osiągnąć za pomocą SQLCLR. Utworzenie funkcji skalarnej, która akceptuje dwa parametry wejściowe typu, jest dość proste
NVARCHAR(MAX)
.Poniższy przykład ilustruje tę umiejętność przy użyciu darmowej wersji biblioteki SQL # SQLCLR (którą utworzyłem, ale String_Contains jest ponownie dostępny w bezpłatnej wersji :-).
USTAWIAĆ
TESTY
Należy pamiętać, że String_Contains korzysta z porównania wszystkiego ( wielkość liter, akcent, Kana i szerokość).
źródło
Ponieważ poprosiłeś także o alternatywne podejście, innym sposobem na znalezienie konkretnego planu jest jego wyszukanie
plan_hash
, zmieniając zapytanie w następujący sposób:Najszybszym sposobem na znalezienie
QueryHash
wartości do wyszukania jest wklejenie danego zapytania do okna zapytania, a następnie wyświetlenie szacowanego planu wykonania. Przeczytaj dane wyjściowe XML i poszukajQueryHash
atrybutu wStmtSimple
elemencie, a to powinno dać ci to, czego potrzebujesz. Podłącz wartość QueryHash do powyższego zapytania i mam nadzieję, że powinieneś mieć to, czego szukasz.Oto kilka zrzutów ekranu pokazujących, jak szybko uzyskać
QueryHash
wartość na wypadek, gdy źle ją wytłumaczę.Wyświetl szacunkowy plan wykonania
Pokaż plan wykonania XM ...
Wyszukaj wartość QueryHash
Oczywiście sztuczka nie zadziała, jeśli zapytanie, którego szukasz, różni się od zapytania, dla którego wyświetlasz Szacowany plan wykonania, ale może to być szybsze niż wszystkie niuanse, które występują w procedurach CLR i sprawienie, aby działały poprawnie.
źródło
Jeśli masz dostęp do tekstów zapytań (co oznacza, że możesz je modyfikować), możesz dodać unikalne komentarze do tych, którzy są zainteresowani:
następnie wyszukaj
myUniqueQuery123
w pamięci podręcznej planu zamiast całego tekstu zapytania:PS. Nie testowany
źródło