Benim sorunum (ya da en azından hata mesajı) iç kaynak - son derece uzun sql sorgusu bitti sorgu işlemcisi çok benzer .
Müşterim, tam 100.000 giriş içeren bir nerede-cümlesi içeren bir SQL seçme sorgusu ile çalışıyor.
Sorgu 8632 hatası ve hata iletisiyle başarısız oluyor
Dahili hata: Bir ifade hizmetleri sınırına ulaşıldı. Lütfen sorgunuzda potansiyel olarak karmaşık ifadeler arayın ve bunları basitleştirmeye çalışın.)
Bu hata mesajının tam olarak 100.000 girişe atıldığını çok tuhaf buluyorum, bu yüzden bu yapılandırılabilir bir değer olup olmadığını merak ediyorum. Bu durumda mı ve evet ise, bu değeri nasıl daha yüksek bir değere yükseltebilirim?
On MSDN , orada sorguyu yeniden yeniden yazmak öneridir, ama bu önlemek istiyorum.
Bu arada bahsettiğim girişler listesinin doğal sayılar içerdiğini öğrendim, bunların bir kısmı sıralı görünüyor (1,2,3,6,7,8,9,10,12, 13,15,16,17,18,19,20).
Bu SQL nerede-cümlesi gibi bir şey yapar:
where entry in (1,2,3,6,7,8,9,10,12,13,15,16,17,18,19,20)
Bunu şu şekilde dönüştürebilirim:
where (entry between 1 and 3) OR
(entry between 6 and 10) OR
(entry between 12 and 13) OR
(entry between 15 and 20)
Bu kısaltılabilir mi:
where entry in (1,...,3,6,...,10,12,13,15,...,20)
...Veya benzeri? (Uzun bir çekim olduğunu biliyorum, ancak yazılım güncellemelerini daha kolay ve daha okunabilir hale getirecektir)
Bilginiz için: nerede yan tümcesindeki veriler başka bir tabloda yapılan bir hesaplamanın sonucudur: ilk önce o tablonun girişleri başlangıçta okunur ve filtrelenir, daha sonra bazı ekstra işlemler yapılır (bunu yapmak imkansızdır) SQL), bu ekstra işlemenin sonucu daha fazla filtrelemedir ve bunun sonucu where-cümlesinde kullanılır. Tüm filtrelemeyi SQL'de yazmak imkansız olduğu için, söz konusu yöntem kullanılmıştır. Açıkçası nerede cümlesi içeriği her işlemde değişebilir, dolayısıyla dinamik bir çözüme ihtiyaç duyulabilir.
WHERE IN
bu tür aralık sözdizimini desteklemiyor. Ayrıca,WHERE () OR () OR ()
VE olmamalıdır . Ama Brent'in önerisini kullanmak için, aslında tüm sorguyu değiştirmek zorunda değilsiniz, sadece yapabilirsinizWHERE IN (SELECT myID FROM #biglist)
. Ve#biglist
ya gerçek (kalıcı) bir masa ya da anında yaptığınız geçici bir masa olabilir.