Tarihsel olarak, değişken sayıda gruplama ile dinamik raporlar standart SQL tarafından öngörülmemiştir — sonuç yapısı için net olarak tanımlanmış bir şemayla statik tanımlı sorgular için tasarlanmıştır. BI platformlarının ve etkileşimli panoların ortaya çıkmasıyla birlikte, programcılar kullanıcı talebine göre karmaşık çoklu veri kesitleri oluşturmak için "anlık" olarak SQL sorguları inşa etmenin yollarını aramaya başladılar.
Sorun — SQL'de SELECT içinde standart if/else mantığı ile programlama yapılamaz — sütun sayısı, alanlar ve hatta GROUP BY yalnızca sorgunun derleme aşamasında belirlenir. Kullanıcı birkaç isteğe bağlı alanda bir kesit istiyorsa, sorgu metnini dinamik olarak toplamak ve EXECUTE/Dynamic SQL ile çalıştırmak zorunda kalır.
Çözüm:
SQL kodunun dış uygulamada oluşturulması ve ardından EXEC/EXECUTE ile çağrılmasını sağlarlar. Bazı durumlarda basit görevler için CASE ve sert şablonlar kullanılır, ancak esneklik için her zaman dinamik SQL'e başvurulur:
Kod örneği (Pseudocode):
-- Uygulama tarafında (örneğin, Python) groups = ['region', 'channel', 'month'] columns = [f'SUM({col}) AS {col}_sum' for col in selected_metrics] group_by = ', '.join(groups) selects = ', '.join(groups + columns) query = f'SELECT {selects} FROM sales GROUP BY {group_by}' -- Daha sonra bu sorgu application/sql arayüzü ile gönderilir
EXECUTE desteği olan bir DBMS'de:
DECLARE @sql NVARCHAR(MAX); SET @sql = N'SELECT ' + @selects + ' FROM sales GROUP BY ' + @group_by + ';'; EXEC sp_executesql @sql;
Anahtar özellikler:
Dinamikk olarak sütun sayısını değiştirmek (pivot/unpivot) standart SELECT ile dinamik SQL olmadan mümkün müdür?
Hayır — yalnızca önceden bilinen değerler CASE/DECODE ile "açılabilir", ancak bilinmeyen sütun sayısı yalnızca dinamik olarak elde edilir.
Dinamik SQL mantığınız, string concatenation kullanıyorsanız enfeksiyonları önler mi?
Hayır, manuel string birleştirme sürekli bir SQL Injection riski taşır. Alanların/grupların beyaz listeye alınarak doğrulanması zorunludur, onaylanmamış kullanıcı parçalarını kullanmaktan kaçınmak ve mümkünse parametreler kullanmak çok daha iyidir.
GROUP BY, bir değişken aracılığıyla bir sütun listesi alabilir mi?
Standart SQL GROUP BY'a bir alan listesinin değişken/parametre aracılığıyla geçilmesini desteklemez. Sorgu metninin dinamik olarak oluşturulması gerekir — GROUP BY listesindeki bir değişkeni doğrudan kullanamazsınız.
BI mühendisinin, kullanıcıya doğrudan uygulama arayüzünden rapor için alan isimlerini geçmesine izin vermesi — bunları beyaz liste ile filtrelemeden. Sonuç olarak, enfeksiyon testinde, bir alan adındaki zararlı kod nedeniyle üretim tablosu "çökmüştü".
Artılar:
Eksiler:
Mühendis, isimlerin sıkı bir şekilde doğrulanmasını sağladı — kullanıcı yalnızca izin verilen sütunlardan (config/metadata'dan) seçim yapabiliyordu, dinamik SQL yalnızca beyaz listeye dayalı olarak toplandı, enfeksiyon yolları yoktu.
Artılar:
Eksiler: