SQL kodu oluşturmak için algoritma


11

SQL kodu (SQL Server / MySQL) biçimlendirecek bir araç (ev kullanımı için) gerekir.
Bunu yapan çeşitli üçüncü taraf araçları ve çevrimiçi web siteleri var ama tam olarak nasıl ihtiyacım yok.

Bu yüzden ihtiyaçlarıma uygun kendi aracımı yazmak istiyorum.

İlk soru, SQL kodunun nasıl biçimlendirilmesi gerektiğine dair herhangi bir standart veya kural var mı? (denediğim araçlar farklı biçimlendiriyor)

İkinci soru, bu göreve nasıl yaklaşmalıyım? Önce sql sorgusunu bir ağaç gibi bir veri yapısına dönüştürmeli mi?

Yanıtlar:


2

... SQL kodunun nasıl biçimlendirilmesi gerektiğine dair herhangi bir standart veya kural var mı?

Standart, hayır. Bir SQL çözümleyici söz konusu olduğunda, bir SQL deyiminin tamamını bir satıra koyabilirsiniz.

Konvansiyon, tabii ki çok var. Değiştirilebilirliği en üst düzeye çıkarmaya veya alanı en aza indirmeye çalışmanıza bağlıdır. Her iki durumda da SQL biçimlendiricileri yazdım.

SQL ifadesinin nerede kırılacağını söylemek için belirli karakter kombinasyonlarını kullandım.

İşte yazdığım bir Java DB2 SQL biçimlendiricisinden bir örnek . Başka bir Java programı Java kodunu oluşturdu. SQL doğrudan SYSIBMtablolardan geldi .

protected void prepareIndex00Select(String codeFacl)
        throws SQLException {
    StringBuffer sb = new StringBuffer();
    sb.append("SELECT CODE_FACL, SEQ_FACL, FILLER_TOF ");
    sb.append("    , CODE_TOF, NAME_FACL, NAME_LENGTH ");
    sb.append("    , CODE_FMB, ID_NCIC_ORI, NBR_PRINTER_PREFIX ");
    sb.append("    , ID_PERSONNEL_OFC, COMPLEX_CODE ");
    sb.append("    , PHS_CODE, DESIG_FACL_GRP, IND_DESIG_AUTH ");
    sb.append("    , CODE_FACL_I_T, INTKEY_FACL, IND_CDM_SENTENCING ");
    sb.append("    , MAL_FEM_IND, DEL_AFTER, IND_INMATES ");
    sb.append("    , VALUE_SO_CPU_STD, VALUE_SO_CPU_DAY ");
    sb.append("    , CODE_CAT, VALUE_DCN, XIDBKEY ");
    sb.append("    , FACL_FK_REGN ");
    sb.append("  FROM ");
    sb.append(creator);
    sb.append(".FACL ");
    sb.append("  WHERE CODE_FACL = ? ");
    if (additionalSQL != null) sb.append(additionalSQL);

    psIndex00 = connection.prepareStatement(sb.toString());
    psIndex00.setString(1, codeFacl);

}   // End prepareIndex00Select method

Ürününüz (biçimlendirici) çevrimiçi olarak veya indirilebilir mi?
jullins

@jullins: Hayır. Sadece Java sınıfları yazan bir Java uygulaması yazabileceğimi ve veritabanı sütunundan ve dizin tablolarından (SYSIBM) SQL oluşturduğumu kanıtlamak için yazdım. Ne yazık ki, birlikte çalıştığım kimse bunu yararlı bulmadı. İsterseniz kodu bir yere koyabilirim.
Gilbert Le Blanc

Bunu takdir ediyorum, sadece biçimlendirme bölümünü görmek istiyorum.
jullins

@jullins: Şu an işteyim, bu yüzden halka açık depolara erişemiyorum. Kodu bu hafta sonu bir yere koyacağım ve nasıl erişeceğinizi size bildireceğim.
Gilbert Le Blanc

kod ne olacak? Bir yere koyabilir misin?
jullins

2

Biraz geç, sadece bununla karşılaştım, üzgünüm.

Zavallı Adamın T-SQL Biçimlendiricisi açık kaynaklı bir T-SQL biçimlendiricisidir (kütüphane, ssms eklentisi, komut satırı dosya biçimlendiricisi, vb.) - uygulama makul modülerdir ve bir MySQL tokenizatörü ve biçimlendiriciyi uygulamak çok zor olmamalıdır T-SQL olanları eşleştirmek için (Ben şimdi hiç MySQL deneyimi veya kullanımı için, çünkü bu yüzden yapmadım, bu yüzden zamanımın iyi bir kullanım değil).

Kütüphane, AGPL lisansı ile C # (2.0) 'da uygulanır - bu, herhangi bir değişiklik yayınlamadan ticari olarak yeniden dağıtamayacağınız veya bir kamu hizmeti olarak ifşa edemeyeceğiniz anlamına gelir, ancak şirket içi kullanıcı için, özelleştirilmiş veya değil.

@Gilbert Le Blank'ın zaten yanıtladığı gibi, SQL formatlama konusunda kesinlikle bir standart yoktur - orada ticari formatlayıcılar bile sağladıkları farklı seçeneklerle aynı varsayılanlarla birleşmezler veya aynı çıktı formatlarını desteklemezler.

Kendi aracınızı sıfırdan yazmakla ilgili olarak, çeşitli durumları ele almanız gerekiyorsa buna karşı öneriyorum: en azından T-SQL için, CTE WITH yan tümceleriyle SQL çoklu ifade toplu işlemlerini, MERGE deyimlerini, alt sorguları ve türetilmiş tablolar, vb oldukça zor olduğu ortaya çıkıyor :)

Herhangi bir yardımcı olması durumunda: http://www.architectshack.com/PoorMansTSqlFormatter.ashx

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.