Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Source Code Formatter für SQL gesucht (https://www.delphipraxis.net/80755-source-code-formatter-fuer-sql-gesucht.html)

GuenterS 14. Nov 2006 18:40


Source Code Formatter für SQL gesucht
 
Hallo,

ich hoffe ich liege nicht ganz daneben, wenn ich diese Frage in diesem Teil des Forums poste.

Ich suche einen möglichst freien, formatierer für SQL.

alzaimar 14. Nov 2006 19:18

Re: Source Code Formatter für SQL gesucht
 
Ich kenn noch nichtmal irgendwelche Styleguides, wie man SQL formatieren sollte. Ich mach es auch mal so - mal so.

GuenterS 14. Nov 2006 19:50

Re: Source Code Formatter für SQL gesucht
 
Bei einem simplen Select Statement braucht man das auch nicht umbedingt, aber wenn Du eine 3 bis 4 Seiten lange Stored Procedure hast, wäre eine "richtig" eingerückte Formatierung recht hilfreich um gleich zu sehen, wo man sich befindet.

alzaimar 14. Nov 2006 20:12

Re: Source Code Formatter für SQL gesucht
 
Ich rede von 3-4 Seiten langen SELECT's... Nee, nicht ganz...

Für welchen SQL-Dialekt soll das sein? Das Blöde ist doch, das jeder Server seinen eigenen Dialekt hat und Du einen Formatter für jeden Dialekt benötigen würdest.

Eventuell haben die guten Admin-Tools sowas dabei, aber ein googel nach "SQL Formatter" ergab schon mal genügend Quellen...

GuenterS 14. Nov 2006 20:16

Re: Source Code Formatter für SQL gesucht
 
Zitat:

Zitat von alzaimar
Ich rede von 3-4 Seiten langen SELECT's... Nee, nicht ganz...

Für welchen SQL-Dialekt soll das sein? Das Blöde ist doch, das jeder Server seinen eigenen Dialekt hat und Du einen Formatter für jeden Dialekt benötigen würdest.

Eventuell haben die guten Admin-Tools sowas dabei, aber ein googel nach "SQL Formatter" ergab schon mal genügend Quellen...


Hm, hättest ja eine einzige der so vielen Quellen posten können.... Was man massenhaft findet, sind Online SQL Formatierer, ich möchte aber ungern, die Stored Procedures und Functions einem Online tool anvertrauen.

Suche es jedenfalls für MS Sql Server. Es gibt doch auch für Programmiersprachen Source Code formatter, obwohl die Dialekte C++, C, Pascal, C#, Java, ... alle etwas unterschiedlich sind.

rwachtel 14. Nov 2006 20:50

Re: Source Code Formatter für SQL gesucht
 
Mein liebstes Datenbanktool enthält auch einen SQL Code-Beautifier: Aqua Data Studio.

Vielleicht ist es ja was für Dich.

alzaimar 14. Nov 2006 21:18

Re: Source Code Formatter für SQL gesucht
 
@Günter: Ich habe Stored Procedures bisher eher durch ausführliche Kommentierung lesbar gestaltet nd werde diese Praxis beibehalten. Wenn ich einen Formatter (oder Beautifier o.ä.) hätte, würde ich mir das abgewöhnen :zwinker: .

@RWachtel: Wow!

GuenterS 14. Nov 2006 21:24

Re: Source Code Formatter für SQL gesucht
 
Zitat:

Zitat von alzaimar
@Günter: Ich habe Stored Procedures bisher eher durch ausführliche Kommentierung lesbar gestaltet nd werde diese Praxis beibehalten. Wenn ich einen Formatter (oder Beautifier o.ä.) hätte, würde ich mir das abgewöhnen :zwinker: .

@RWachtel: Wow!

Kommentare sind immer gut, nur sagen Dir die auch nicht automatisch zu welchem Beginn ein bestimmtes End gehört...

Leider hat unser Query Analyzer und manch TextEditor eingefüge Leerzeichen und Tabs anders darzustellen und wirft somit die entsprechenden Einrückungen durcheinander. Auch müsste man ohne tool bei einem eingeführten If Block, alle darin enthaltenen Statements wieder manuell einrücken. Da kann ein SQL-Formatier-Programm schon helfen. Kommentare ersetzen kann es nicht (wie auch kein anderer Source Code Formatierer)

Ich werd mir das Aqua studio mal ansehen.

Elvis 14. Nov 2006 21:25

Re: Source Code Formatter für SQL gesucht
 
Zitat:

Zitat von GuenterS
Suche es jedenfalls für MS Sql Server. Es gibt doch auch für Programmiersprachen Source Code formatter, obwohl die Dialekte C++, C, Pascal, C#, Java, ... alle etwas unterschiedlich sind.

Ich wollte dir gerade den PL/SQL Developer vorschlagen, bis ich gelesen habe dass es kein normales DBMS ist, was du da benutzt. Was SQL angeht formatiert sein Beautifier eigentlich alles, genau so wie man es will. Nur bei diesem abartig widerlichen TSQL weigert er sich naserümpfend. ;)
Damit sehen auch Packages mit zig Methoden noch schnieke aus, aber zaubern kann er ja auch nicht. (@TSQL)

jensw_2000 14. Nov 2006 23:44

Re: Source Code Formatter für SQL gesucht
 
Hier ist ein kostenloser Online-Codeformatter.
Ich finde das Teil recht gut.

http://www.sqlinform.com/

Hansa 15. Nov 2006 00:34

Re: Source Code Formatter für SQL gesucht
 
Zitat:

Zitat von jensw_2000
Hier ist ein kostenloser Online-Codeformatter.

Will er doch (halb zurecht) nicht online haben.

Zitat:

Zitat von GuenterS
...Kommentare ersetzen kann es nicht (wie auch kein anderer Source Code Formatierer)

Wie soll er denn die auch ersetzen ? :shock: Standard-Kommentare gehen mit Sicherheit und dann raten oder wie, wie der genauer zu formulieren ist ? Das kann wohl nur der Programmierer selbst.

Relativ spät wurde bekanntgegeben, daß es um MS-SQL geht. Kenne das zu wenig. Was kann denn da das vewendete Admin-Tool überhaupt ? Habe vorher schon in IBExbert geguckt, wie das hier genau aussieht. Deklaration usw. wird bei SPs automatisch eingerückt (geht ähnlich wie mit Delphi. Einrückungstiefe usw. lässt sich einstellen). Der Procedure - Rumpf liegt im Ermessen des Developers.

Allerdings fiel mir folgendes auf : der DB-Source beherrscht Syntax-Highlighting. Wie siehts denn damit aus ? Das ist doch wichtiger als Einrückungen. Und dann gehts auch richtig los mit Alzaimers Sprach-Bedenken.

Lade die betreffenden Zeilen notfalls in Delphi, verschiebe sie spaltenweise und dann eben wieder zurück damit.

rwachtel 15. Nov 2006 05:53

Re: Source Code Formatter für SQL gesucht
 
Zitat:

Zitat von Hansa
[...]
Zitat:

Zitat von GuenterS
...Kommentare ersetzen kann es nicht (wie auch kein anderer Source Code Formatierer)

Wie soll er denn die auch ersetzen ? :shock: [...]

Noch früh am Morgen? :mrgreen:

Ich glaube, es ging darum, dass der Einsatz eines entsprechenden Tools Kommentare nicht überflüssig macht... ;)

jensw_2000 15. Nov 2006 06:28

Re: Source Code Formatter für SQL gesucht
 
Zitat:

Zitat von Hansa
Zitat:

Zitat von jensw_2000
Hier ist ein kostenloser Online-Codeformatter.

Will er doch (halb zurecht) nicht online haben.

Hmmm,
als ich das letzte mal auf der Seite war, wurde das Tool für wenig Geld auch als Offline-Version angeboten.
Wenn ihm die Onlineversion gefällt, kann er sich ja mal mit dem Autor in Verbindung setzen.

alzaimar 15. Nov 2006 07:08

Re: Source Code Formatter für SQL gesucht
 
Hab mir eben Aqua-Data-Studio angeschaut. Ganz nett, aber so richtig klappt das mit dem Formatieren auch nicht:
Aus

SQL-Code:
ALTER PROCEDURE [dbo].[DeleteAllCustomers]
@bla int
AS
IF @bla=1287
BEGIN
   SELECT * FROM Customer;
END
GO
wird
SQL-Code:
ALTER PROCEDURE [dbo].[DeleteAllCustomers]
  @bla INT AS IF
  @bla=1287 
  BEGIN SELECT * 
        FROM Customer;
        END
GO
:shock: Ahh.... Ja :gruebel:

Langsam verstehe ich GuenterS...

Mein Problem sind nicht die paar Einrückungen bei IF / WHILE etc. , sondern die Lesbarkeit von komplexen SELECT's.
Ich hab 20 Jahre mit Leertaste eingerückt, da gewöhnt man sich dran, aber diese SELECTS (mit JOIN, subselects etc. ) sind immer wieder eine Herausforderung. Und ob man da einen Formatter findet, der das einigermaßen hinbekommt ...

Aber wie man sieht, klappts ja wohl auch noch nicht mal mit einfachen Strukturen. Im Übrigen dürte das keine Eigenheit von TSQL sein...

guidomarcel 25. Nov 2006 21:33

Re: Source Code Formatter für SQL gesucht
 
Hallo,
SQLinForm ist zwar ein Online SQL Formatter, aber es werden keine Daten vom Applet an den Server geschickt. Das kann man einfach testen, indem man die Internet-Verbindung kappt. Das Applet funktioniert dann noch immer, da es lokal im JRE ausgeführt wird.

Ich wäre im übrigen sehr dankbar für Formatierungsvorschläge, vor allem bei den Stored Procedures.

Viele Grüße
GuidoMarcel
www.sqlinform.com

Hansa 25. Nov 2006 23:32

Re: Source Code Formatter für SQL gesucht
 
Ist das Thema immer noch nicht gegessen ? :shock: Formatiere die SP doch so, wie es auch von Delphi her gewohnt ist. Also einrücken usw. Siehe IBExpert. Aber es geht ja um MS-SQL.

Warum gibt es eigentlich keinen Formatter für SQL ? Weil es nicht nötig ist. :mrgreen: Es war auch die Rede von 5-Seiten SP. Wer so was macht, der macht IMHO was verkehrt. 8) Wer soll denn das lesen und verstehen ? Das muss man mehr unterteilen.

GuenterS 26. Nov 2006 08:58

Re: Source Code Formatter für SQL gesucht
 
Zitat:

Zitat von Hansa
Ist das Thema immer noch nicht gegessen ? :shock: Formatiere die SP doch so, wie es auch von Delphi her gewohnt ist. Also einrücken usw. Siehe IBExpert. Aber es geht ja um MS-SQL.

Warum gibt es eigentlich keinen Formatter für SQL ? Weil es nicht nötig ist. :mrgreen: Es war auch die Rede von 5-Seiten SP. Wer so was macht, der macht IMHO was verkehrt. 8) Wer soll denn das lesen und verstehen ? Das muss man mehr unterteilen.

Zwischen Theorie & Praxis ist (leider) immer (meistens) ein (großer) Unterschied. Es soll auch vorkommen, dass Programme mit der Zeit wachsen u. mal dort mal da, ein Feature dazukommt ohne immer gleich alles Umzuschreiben. Es soll auch vorkommen, dass dazu die Zeit fehlt bzw. nicht gegeben wird.

Dass ich die Procedure auch von Hand neu formatieren kann bez. Einrückungen, das war hier nicht das Thema. Ich erkläre es Dir aber gerne noch einmal. Ich suche einen Formatierer für MS-SQL Server Stored Procedures, Functions, Triggers, ..., allerdings keine Online Version. Ich kann nicht eben mal die Internet Verbindung kappen, wenn ich gerade mittels RDC auf dem PC eines Kunden bin.

Ziel des Threads ist/war es, solch einen zu finden, offensichtlich gibt es anscheinend wirklich keinen der das perfekt kann. Es war nicht das Ziel andere Leute zu zwingen, nun auch einen SQL-Formatierer zu verwenden. Insofern verstehe ich nicht, was Dein Post hier soll.

jensw_2000 26. Nov 2006 16:56

Re: Source Code Formatter für SQL gesucht
 
Zitat:

Zitat von guidomarcel
Hallo,
Ich wäre im übrigen sehr dankbar für Formatierungsvorschläge, vor allem bei den Stored Procedures.

Dann möchte ich mal meinen Wunschzettel abgeben :zwinker:

SQL-Code:
CREATE PROCEDURE PROC_123
   @ID_AgentGroups UNIQUEIDENTIFIER
  ,@ID_AddressPool UNIQUEIDENTIFIER
  ,@Egal BIT
AS
BEGIN
---------------------------------------------------------------------------------------
/*
Prozedur Beschreibung und
Copyright
*/
---------------------------------------------------------------------------------------

  -- einzeilige Kommentare beginnen über dem ersten Zeichen des 1. Wortes der Folgezeile
  -- wenn in der selben Zeile kein SQL Code steht
  SELECT a FROM b                 -- oder 4-8 Tabs hinter dem SQL-Code

/*
mehrzeilige Kommentare beginnen am Anfang der Zeile
*/

  -- lokale Variablen
  DECLARE @ABC INT                -- keine Zeerzeilen zwischen 2 Deklarationen
  DECLARE @BCD VARCHAR(10)        -- eine Zeerzeile nach der letzten Deklarationen

  -- Definitionen
  SET NOCOUNT ON                  -- eine Leerzeile nach jedem syntaktischen Block
                                   -- (SET ; SELECT ; INSERT ; UPDATE usw)

  -- Daten sammelm
  SELECT
    A.ABC
   ,B.BCD
   ,B.CDE
   ,A.DEF
   ,B.EFG
  INTO #aTempTable
  FROM
    aTable A
    INNER JOIN
      (
        SELECT
          B AS BCD
         ,C AS CDE
         ,EFG,
         ,DEF
        FROM
          SonstWo

        UNION ALL                  -- UNION (ALL) durch Leerzeilen getrennt

        SELECT                     -- Mehrspaltiger (Sub-)SELECT mit Umbruch
          B AS BCD
         ,C AS CDE
         ,EFG,
         ,DEF
        FROM
          NochWoanders
        WHERE
          EFG IN
            (
              SELECT E FROM eTable -- einspaltiger (Sub-)Select ohne Umburch
            )
          AND
          EFG IS NOT NULL
          OR
          ID < 10000
      ) B
    ON B.DEF = A.DEF              -- nach ON 2 Leerzeichen, damit AND ordentlich
    AND B.BCD IS NOT NULL          -- darunter passt

  SET NOCOUNT ON

  INSERT INTO abcTable             -- ein INSERT INTO SELECT Block, also keine Leerzeile
  SELECT * FROM #aTempTable

  SELECT * FROM #aTempTable

END
berechnete Felder hätte ich gerne so formattiert:
(bitte keine Kritik zu dem Beispiel-SQL-Code, ich kenne die ISNULL Funktion :mrgreen: )

SQL-Code:
SELECT
    CASE
        WHEN dbo.SYS_Agents.Vorname IS NOT NULL
        THEN dbo.SYS_Agents.Vorname
        ELSE 'Agent gelöscht'
    END AS Vorname
    ,
    CASE
        WHEN dbo.SYS_Agents.Nachname IS NOT NULL
        THEN dbo.SYS_Agents.Nachname
        ELSE 'Agent gelöscht'
    END AS Nachname
    ,
    CASE
        WHEN dbo.SYS_Agents.Fullname IS NOT NULL
        THEN dbo.SYS_Agents.Fullname
        ELSE 'Agent gelöscht'
    END AS Fullname
    ,
    usw.


Schöne Grüße,
Jens
:hi:

alzaimar 26. Nov 2006 18:24

Re: Source Code Formatter für SQL gesucht
 
Hi Jens, ich würde das gaaaaaaaaaaaannz anders machen, und deshalb wird es den perfekten SQL-Formatter nicht geben. Aber ich glaube, Guenter würde auch einer reichen, der es irgendwie ordendlich hinbekommt.

guidomarcel 26. Nov 2006 20:07

Re: Source Code Formatter für SQL gesucht
 
Zitat:

Dann möchte ich mal meinen Wunschzettel abgeben
Hallo Jens,
vielen Dank für die Beispiele. Ich werde mal versuchen, diese Regeln einzubauen. Die SQL Statements müßten teilweise schon so formatiert werden, wie Du das vorschlägst, aber bei den Stored Procedures hapert es noch, da ich mich bisher auf ORACLE und DB2 konzentriert habe.

SQL-Code:
------------------------------------------   
-- This is an example SQL  
------------------------------------------   
 SELECT price.c1      AS c1,
        price.c2      AS c2 ,
        price.c3      AS c3,
        max(price.c4) AS c4,
        max(price.c5) AS c5,
        max(price.c6) AS c6,
        max(price.c7) AS c7 
   FROM table_1 t1,
        table_2 t2 
  WHERE c1      = c2 
    AND c_1     = small_c
    AND c_3411 <= c_12_sup
    AND c1      = 'Test Run'
    AND c_4532  = c1.dert
  UNION
 SELECT price.c1      AS c1,
        price.c2      AS c2 ,
        price.c3      AS c3,
        max(price.c4) AS c4,
        max(price.c5) AS c5,
        max(price.c6) AS c6,
        /*******************     
        * This is a block *     
        * comment within a *     
        * SQL statement   *     
        *******************/ 
        max(price.c7) AS c7 
   FROM
        (SELECT store.c1,
                cast (store.c2 AS integer) AS c2, -- inline comment
                store.cwe34r3              AS c3, -- inline comment
                store.c4_prod             AS c4, -- inline comment
                store.c5_pre_prod_first   AS c5 , -- inline comment
                substr(store.c6,11,1)     AS c6, -- inline comment
                store.c7                   AS c7   -- inline comment
           FROM
                (SELECT lib.c1,
                        ---------------------     
                        -- This is a line --     
                        -- comment in a   --     
                        -- SQL statement  --     
                        ---------------------     
                        lib.c2,
                        lib.c3 -- inline comment    
                        ,
                        CASE   lib.c4 
                                WHEN   cheap
                                THEN   digits(lib.c27) concat lib.c28 
                                ELSE   123456 
                        END AS c4,
                        CASE   lib.c5 
                                WHEN   expensive
                                THEN   digits(lib.c27) concat lib.c28 
                                ELSE   123456 
                        END AS lib.c6,
                        CASE   c7 
                                WHEN   free
                                THEN   digits(lib.c27) concat lib.c28 
                                ELSE   123456 
                        END AS c7,
                   FROM
                        (SELECT integer(substr(onelibsales.c1,11,10)) AS c1,
                                substr(onelibsales.c2,21,10)         AS c2 ,
                                onelibsales.c3,
                                onelibsales.c4,
                                substr(onelibsales.c5,31,6) AS c5,
                                substr(onelibsales.c6,37,2) AS c6,
                                substr(onelibsales.c7,39,6) AS c7,
                           FROM
                                (SELECT libs.c1,
                                        libs.c2,
                                        max(libs.c3)           AS libs.c3 ,
                                        max(char(libs.c4,iso) ) AS c5 
                                   FROM
                                        (SELECT tv.c1,
                                                tv.c2,
                                                max(digits(tv.c3)) AS libmax
                                           FROM db1.v_table1 tv
                                          WHERE tv.c1 <> 'Y'
                                            AND tv.c1 in ( 'a' , '1' , '12' )
                                            AND tv.c2 >= date(tv.c4)
                                            AND tv.c3  < date(tv.c15)
                                       GROUP BY tv.c1,
                                                tv.c2 
                                        ) AS libprod,
                                        db1.table2 th
                               GROUP BY libs.c1,
                                        libs.c2 
                                ) AS onelibsales
                        ) AS lib
                LEFT OUTER JOIN db1.v_table3 libstat
                     ON libstat.c1   = lib.c1 
                    AND libstat.c2   = lib.c2 
                     OR ( libstat.c4 = lib.c4 
                    AND libstat.c5   = lib.c5 )
                        /******************* 
                        * This is a block * 
                        * comment within a * 
                        * SQL statement   * 
                        *******************/ 
                    AND ( libstat.c5 = 'I'
                     OR libstat.c4   = 'Gold'
                     OR libstat.c5   = 'Bold' )
                    AND libstat.c6  <= 'Z74'
                ) AS x
        ) AS price
  WHERE price.c1  < 'R45'
     OR ( price.c2= 'R46'
        /******************* 
        * This is a block * 
        * comment within a * 
        * SQL statement   * 
        *******************/ 
    AND price.c3 = 6 )
GROUP BY price.c1,
        price.c2,
        /******************* 
        * This is a block * 
        * comment within a * 
        * SQL statement   * 
        *******************/ 
        price.c3,
        price.c4,
        price.c5,
        price.c6,
        price.c7

Grüße
GuidoMarcel


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz