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):
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'