Masalah saya (atau setidaknya pesan kesalahan) sangat mirip dengan prosesor kueri kehabisan sumber daya internal - kueri sql yang sangat panjang .
Pelanggan saya bekerja dengan kueri pemilihan-SQL, yang berisi klausa di mana dengan tepat 100.000 entri.
Permintaan gagal dengan kesalahan 8632 dan pesan kesalahan
Kesalahan internal: Batas layanan ekspresi telah tercapai. Harap cari kemungkinan ekspresi kompleks dalam kueri Anda, dan cobalah untuk menyederhanakannya.)
Saya merasa sangat aneh bahwa pesan kesalahan ini dilemparkan, tepat pada 100.000 entri, jadi saya ingin tahu apakah ini adalah nilai yang dapat dikonfigurasi. Apakah ini masalahnya dan dalam kasus ya, bagaimana saya bisa meningkatkan nilai ini ke yang lebih tinggi?
Di MSDN , ada proposal untuk menulis ulang kueri, tapi saya ingin menghindari ini.
Sementara itu saya telah menemukan bahwa daftar entri yang saya bicarakan berisi bilangan asli, beberapa dari mereka tampaknya berurutan (seperti (1,2,3,6,7,8,9,10,12, 13,15,16,17,18,19,20).
Ini membuat SQL di mana-klausa seperti:
where entry in (1,2,3,6,7,8,9,10,12,13,15,16,17,18,19,20)
Saya bisa mengubah ini menjadi:
where (entry between 1 and 3) OR
(entry between 6 and 10) OR
(entry between 12 and 13) OR
(entry between 15 and 20)
Bisakah ini disingkat dengan:
where entry in (1,...,3,6,...,10,12,13,15,...,20)
... atau yang serupa? (Saya tahu ini sangat sulit, tetapi itu akan membuat pembaruan perangkat lunak lebih mudah dan lebih mudah dibaca)
Untuk informasi Anda: data di mana-klausa adalah hasil perhitungan, dilakukan pada tabel lain: pertama entri tabel itu dibaca dan difilter di awal, kemudian beberapa pemrosesan tambahan dilakukan (yang tidak mungkin dilakukan dengan menggunakan SQL), hasil dari pemrosesan ekstra lebih banyak penyaringan dan hasil yang digunakan di mana-klausa. Karena tidak mungkin untuk menulis penyaringan lengkap dalam SQL, metode yang disebutkan telah digunakan. Tentunya isi dari mana-klausa mungkin berubah di setiap pemrosesan, karenanya kebutuhan solusi dinamis.
WHERE IN
tidak mendukung sintaks rentang semacam itu. Juga, seharusnyaWHERE () OR () OR ()
bukan DAN. Tetapi untuk menggunakan saran Brent, Anda sebenarnya tidak harus mengubah seluruh permintaan, Anda bisa melakukannyaWHERE IN (SELECT myID FROM #biglist)
. Dan#biglist
bisa berupa meja nyata (permanen), atau meja temp yang Anda buat dengan cepat.