Announcement

Collapse
No announcement yet.

Wie modularisiere ich SQL-Views um Spagetticode zu vermeiden?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Wie modularisiere ich SQL-Views um Spagetticode zu vermeiden?

    Hallo,

    seit kurzem arbeite ich mit T- SQL am MSSQL Server 2000 und 2008 und muss Scripte warten, die von anderen geschrieben wurden. Ich bin neu in T-SQL.

    Das Problem: die Scripte , z.B. Views sind teilweise 1-2 A4 Seiten lang, enthalten viele Case-Anweisungen, Formatierungsfunktionen und mehrere JOINS. Als Ergebnis sind solche Spagetti-Code-Views schwer wartbar.

    Meine Frage: Gibt es eine Möglichkeit/Strategie T-SQL Views zu modularisieren?
    Z. B. vielleicht macht es Sinn mehrere kleinere Views zu gestalten und auf sie aufbauend ein komplexeres View. Oder über Scirpt-Funktionen..?

    Hier nur um den Horror zu schildern ein View das ich um 70% reduziert habe und das meiste mit "..." ersetzt habe (Meine Meinung nach sollten solche Programmierpraktiken per Gesetzt verboten werden):

    Code:
    CREATE VIEW MyLongView AS
    SELECT DISTINCT
           basv.A_ID AS A_ID
          ,CASE
              WHEN basv.A_ID IS NULL THEN 0 
              ELSE basv.A_NR
          END AS A_NR
          ,ISNULL(t4.S_KNZ,'-1') + ISNULL(t3.S_KNZ,'-1') AS ASV_KNZ
          ,'A' AS ASV_Aktiv_KNZ   
         ....
          ,CASE
              WHEN basv.ASV_ID IS NULL THEN 
                ISNULL(ltrim(rtrim(t4.SAB_DT_DESC)),'-') + ', Fall '
               +ISNULL(ltrim(rtrim(t3.S_LT_DESC)),'-')
              ELSE basv.ASV_ZT_DESC
          END AS ASV_ZT_DESC
          ....
          ,CASE
              ...
              ELSE ...
           END AS T_Modifikation
    ...
    FROM S_IL_ASV iasv
         INNER JOIN S_BL_DK t1
            ON t1.DK_KNZ = substring(iasv.ASV_KNZ,6,3) AND
               dbo.fSP_GetLadelauf(dbo.fSP_GetLadelauf_NR()) BETWEEN t1.T_Gueltig_Von AND t1.T_Gueltig_Bis
         
         INNER JOIN (
                     SELECT ....
                     FROM S_BL_DK
                     WHERE DK_ID > 0
                     UNION 
                     SELECT ....
                     FROM S_BL_DK
                     WHERE DK_ID > 0
                     UNION          
                     SELECT ...
                     FROM S_BL_DK
                     WHERE DK_ID > 0
                    ) t2
             ON t2.DK_ID = t1.DK_ID
         INNER JOIN S_BL_S t3
      ...
      LEFT OUTER JOIN S_BL_SAB t4
            ON ...
         LEFT OUTER JOIN S_BL_HN t5
            ON ...
         LEFT OUTER JOIN S_BL_ASV basv
          ...
               basv.HN_ID = ISNULL(t5.HN_ID,-1) AND ...
               
         LEFT OUTER JOIN S_BL_EC t6
            ON t6.EC_KNZ = CASE
                                      WHEN ( substring(replace(iasv.ASV_KNZ,' ','$'),9,2) = '$$' OR 
                                             substring(replace(iasv.ASV_KNZ,' ','$'),9,2) = '' ) 
                                      THEN '0' 
                                      ELSE substring(iasv.ASV_KNZ,9,2)
                                   END AND ...           
    WHERE -
          substring(replace(iasv.ASV_KNZ,' ','$'),6,3) NOT IN ('$$$','') AND 
          substring(iasv.ASV_KNZ,6,3) <> '000' AND      
          substring(iasv.ASV_KNZ,6,3) BETWEEN '520' AND '999'
Working...
X