Farklı tablolardaki veri satırlarını aramak için birden çok null parametresi alan çok sayıda "arama saklı yordam" var. Genellikle bu gibi inşa ediyoruz:T-SQL - En uygun olmayan plan kullanılır - WHERE yan tümcesi kısa dönemli olmalıdır
SELECT *
FROM Table1 T1
INNER JOIN Table2 T2
ON T2.something = T1.something
WHERE (@parameter1 IS NULL OR T1.Column1 = @parameter1)
AND (@parameter2 IS NULL OR T2.Column2 = @parameter2)
AND (@parameter3 IS NULL OR T1.Column3 LIKE '%' + @parameter3 + '%')
AND (@parameter4 IS NULL OR T2.Column4 LIKE '%' + @parameter4 + '%')
AND (@parameter5 IS NULL OR T1.Column5 = @parameter5)
Bu kadar 30-40 parametreler için gitmek ve ne fark ettik sadece parametre1 sunulmuş olsa bile olduğunu edebilir, yürütme planı diğer dizin taramaları geçer sorguyu yavaşlatan tablolar (birkaç saniye). Testler bize WHERE ifadesinden sadece ilk satırı tutmanın sorguyu anında yaptıklarını gösterir.
ben shortcuiting mümkün olmadığını okudum ama muhtemelen daha verimli olacaktır sorguları oluşturmak için yollar var geçici veya duyuyoruz?
Şu anda bu soruna, aynı SELECT/FROM/JOINS'in farklı sürümlerine sahip olmakla birlikte, ancak WHERE yan tümcesinde farklı parametreler kümesiyle çalışıyoruz ve hangi parametrelerin geçtiğine bağlı olarak, içinden geçmek için uygun select deyimini seçiyoruz. Bu uzun, dağınık ve korumak zor.
[dynamic SQL] (http://www.sommarskog.se/dynamic_sql.html) kullanmayı düşündünüz mü? [SQL Injection] (http://en.wikipedia.org/wiki/SQL_injection) uyarısı ile bile ihtiyaçlarınız için daha uygun olabilir. – Oded
Yapılandırılmış dinamik sql ve sql enjeksiyonu oluşturma bir sorun değil – StrayCatDBA
Dinamik sql'de yeniden bir bakacağız, ancak yalnızca bir şeyleri nasıl yaptığımıza ve SQL kodunun karmaşık dizelerini, uygulamaların kendileriyle nasıl oluşturduğumuza döneceğiz. Hızlı bir bakışta sorguyu anlamak neredeyse imkansız hale getiren koşulların bir demet. Ayrıca, SQL sorgu stüdyosunda sözdizimi vurgulama/araçlarını bu sorgular için tutmanın bir yolu var mı? – FrancoisCN