Dengan membaca batasan panjang karakter SEPERTI ini di sini, sepertinya saya tidak dapat mengirim teks lebih dari ~ 4000 karakter dalam klausa LIKE.
Saya mencoba mengambil paket permintaan dari cache paket permintaan untuk permintaan tertentu.
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 '?'
jika permintaan di dalam LIKE
lebih dari 4000 karakter maka saya mendapatkan 0 hasil bahkan jika permintaan saya ada dalam rencana cache. (Saya mengharapkan setidaknya eror).
Apakah ada cara untuk mengatasi masalah ini atau melakukannya secara berbeda? Saya memiliki pertanyaan yang 10000
panjangnya > karakter dan sepertinya saya tidak dapat menemukannya dengan LIKE
.
sql-server
t-sql
sql-server-2016
like
Dan Dinu
sumber
sumber
where st.text like '%MY_QUERY%CHARS%' ESCAPE '?'
Jawaban:
Tampaknya ini tidak dapat diselesaikan dalam T-SQL murni karena tidak ada
CHARINDEX
atau tidakPATINDEX
memungkinkan untuk menggunakan lebih dari 8000 byte dalam string "untuk mencari" (yaitu maks 8000VARCHAR
atau 4000NVARCHAR
karakter). Ini bisa dilihat pada tes berikut:Kedua kueri tersebut menghasilkan kesalahan berikut:
Dan, mengurangi
7000
salah satu dari kueri tersebut untuk3999
menghilangkan kesalahan. Nilai4000
dalam kedua kasus juga akan kesalahan (karenaN'Z'
karakter tambahan di awal).NAMUN, ini bisa dicapai dengan menggunakan SQLCLR. Cukup mudah untuk membuat fungsi skalar yang menerima dua parameter input tipe
NVARCHAR(MAX)
.Contoh berikut menggambarkan kemampuan ini menggunakan versi gratis dari perpustakaan SQL # SQLCLR (yang saya buat, tetapi String_Contains lagi tersedia di versi gratis :-).
The String_Contains skalar UDF saat ini memiliki
@SearchValue
param masukan sebagaiNVARCHAR(4000)
bukanNVARCHAR(MAX)
(saya tidak harus berpikir orang akan mencari untuk string lebih dari 4000 karakter ;-) tapi itu sangat mudah untuk perubahan dengan membuat mengikuti perubahan satu kali (setelah SQL # telah diinstal, tentu saja):MEMPERSIAPKAN
UJI
Harap diingat bahwa String_Contains menggunakan perbandingan (huruf, aksen, Kana, dan lebar) yang semuanya sensitif.
sumber
Karena Anda juga meminta pendekatan alternatif, cara lain untuk menemukan rencana spesifik adalah mencarinya
plan_hash
, dengan mengubah kueri Anda sebagai berikut:Cara tercepat yang saya temukan untuk mendapatkan
QueryHash
nilai yang dicari adalah dengan menempelkan kueri yang dimaksud ke dalam Jendela Kueri lalu Tampilkan Perkiraan Rencana Eksekusi. Baca output XML dan cariQueryHash
atribut dalamStmtSimple
elemen dan ini akan memberi Anda apa yang Anda butuhkan. Masukkan nilai QueryHash ke dalam kueri di atas dan semoga Anda memiliki apa yang Anda cari.Berikut adalah beberapa tangkapan layar yang menunjukkan cara cepat mendapatkan
QueryHash
nilai jika saya menjelaskannya dengan buruk.Tampilkan Perkiraan Rencana Eksekusi
Tampilkan Rencana Eksekusi XM ...
Cari Nilai QueryHash
Jelas trik ini tidak akan berfungsi jika kueri yang Anda cari berbeda dari kueri yang Anda tampilkan untuk Perkiraan Rencana Eksekusi, tetapi ini mungkin lebih cepat daripada semua nuansa yang menyertai rutinitas CLR dan membuat kueri tersebut berfungsi dengan baik.
sumber
Jika Anda memiliki akses ke teks kueri (artinya Anda dapat memodifikasinya), Anda dapat menambahkan komentar unik kepada yang Anda minati:
kemudian cari
myUniqueQuery123
di cache rencana alih-alih seluruh teks kueri:PS. Tidak diuji
sumber