У меня возникла проблема с уменьшением размера хранимой процедуры, в которой более 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 на куски, я воспользовался возможностью.
Заранее благодарю за любые предложения.