Как разрезать тысячи строк T-SQL на небольшие хранимые процедуры или функции? - PullRequest
0 голосов
/ 31 октября 2019

У меня возникла проблема с уменьшением размера хранимой процедуры, в которой более 2000 строк кода.

Вот краткий пример (кратко 3 внешних XML, 3 внутренних XML).

CREATE PROCEDURE spu_Get_Rep_Data
    @IdContrat INT,
    @Annee INT,
    @XML XML OUTPUT
AS
BEGIN
    DECLARE @XML_Contrat XML;
    EXEC spu_Get_Contrat @IdContrat = @IdContrat, @XML = @XML_Contrat OUTPUT;

    DECLARE @XML_ProdSous_Ev XML;
    EXEC spu_Get_ProdSous_Ev @IdContrat = @IdContrat, @XML = @XML_ProdSous_Ev OUTPUT;

    DECLARE @XML_Ana_Bact XML;
    EXEC spu_Get_Ana_Bact @IdContrat = @IdContrat, @XML = @XML_Ana_Bact OUTPUT;

    SET @XML = (
        SELECT @Annee AS '@Annee',
               @XML_Contrat,
               @XML_ProdSous_Ev,
               @XML_Ana_Bact,
               (SELECT
                    (SELECT IpLibelle AS '@Name',
                        (SELECT
                            (SELECT 'Entry' AS '@Name',
                                    (SELECT 'Stick'    AS '@Type',
                                            '2E5576'   AS '@Color'
                                        FOR XML PATH ('SeriesConfig'), TYPE),
                                    (SELECT p.Year                                             AS '@Name',
                                            ISNULL(CAST(SUM(p.Valeur) AS DECIMAL(18, 8)), '0') AS '@Val'
                                       FROM dbo.Production AS p
                                      WHERE p.Year = @Annee
                                        AND p.IdContrat = @IdContrat
                                        AND p.IpTypeCode = 407
                                        AND p.IpId = e.IpId
                                      GROUP BY p.Annee
                                      ORDER BY p.Annee
                                        FOR XML PATH ('Categorie'), TYPE)
                                FOR XML PATH ('Serie'), TYPE)
                            FOR XML PATH ('VolYear'), TYPE),
                        (SELECT CAST(SUM(Valeur) AS DECIMAL(18, 8)) AS '@Elec'
                           FROM dbo.Production AS p
                          WHERE p.IdContrat = @IdContrat
                            AND p.IpId = e.IpId
                            AND p.IpTypeCode = 101
                            FOR XML PATH ('ElecStep'), TYPE),
                        (SELECT Name  AS '@Val1',
                                Value AS '@Val2'
                           FROM dbo.Production AS p
                          WHERE p.IdContrat = @IdContrat
                            AND p.IpId = e.IpId
                            AND p.IpTypeCode = 653
                            FOR XML PATH ('ReparationStep'), TYPE)
                      FROM dbo.Entite AS e
                     WHERE IdContrat = @IdContrat
                     ORDER BY e.IpLibelle
                       FOR XML PATH ('StepData'), TYPE)
                   FOR XML PATH ('StepsData'), TYPE)
           FOR XML PATH ('Elements')
        )
END

Он извлекает данные «контрата», который может иметь несколько типов оборудования, и каждый тип содержит хотя бы один экземпляр для форматирования XML.

Было бы намного лучше извлечьвнутренняя SELECT ... FOR XML PATH к хранимой процедуре (которая лучше по производительности, чем пользовательская функция).

Ожидайте результат 1, используя пользовательскую функцию:

SET @XML = (
    SELECT @Annee AS '@Annee',
            @XML_Contrat,
            @XML_ProdSous_Ev,
            @XML_Ana_Bact,
            (SELECT
                (SELECT IpLibelle AS '@Name',
                        (EXEC spu_Get_Vol_Year(e.IpId, @IdContrat, @Annee)),
                        (EXEC spu_Get_Elec(e.IpId, @IdContrat)),
                        (EXEC spu_Get_Reparation(e.IpId, @IdContrat))
                    FROM dbo.Entite AS e
                    WHERE IdContrat = @IdContrat
                    ORDER BY e.IpLibelle
                    FOR XML PATH ('StepData'), TYPE)
                FOR XML PATH ('StepsData'), TYPE)
        FOR XML PATH ('Elements')
    )

3 внешних сохраненныхпроцедура работает. Поскольку хранимая процедура НЕ разрешена для использования в SELECT, 3 внутренних хранимых процедуры, которым требуется параметр IpId , не будут работать. Учитывая, что должен быть кто-то, кто хотел бы упростить любой большой T-SQL на куски, я воспользовался возможностью.

Заранее благодарю за любые предложения.

...