2 réponse :
La premiére est à vérifier mais je pense que l'optimiseur de requette de SQL Serveur détecte la répétition de code et fais lui même les optimisations adéquates, tu dois pouvoir t'en assuré en analysant le plan d'execution de la requette.
La seconde serais de passé par une sous-requette ou une CTE :
DECLARE @AvgTimeMaint_SEC INT = 42;
SELECT
[SRC].[RqtCode],
[SRC].[Dte],
[SRC].[CpyCode],
[SRC].[Obj_Blabla],
[SRC].[Obj_Blabla2],
[SRC].[Obj_Blabla3],
[SRC].[Obj_Blabla] + [SRC].[Obj_Blabla2] + [SRC].[Obj_Blabla3] AS [TotObjMaint]
FROM (
SELECT
RQT.RqtCode,
RQT.Dte,
CPY.CpyCode,
'Obj_Blabla' = dbo.GetNbObj(CPY.CpyInCde,100) * @AvgTimeMaint_SEC,
'Obj_Blabla2' = dbo.GetNbObj(CPY.CpyInCde,200) * @AvgTimeMaint_SEC,
'Obj_Blabla3' = dbo.GetNbObj(CPY.CpyInCde,300) * @AvgTimeMaint_SEC
FROM Request AS RQT
INNER JOIN Company AS CPY
ON RQT.OrigCpyInCde = CPY.CpyInCde
WHERE
... -- pas important ici
) AS [SRC];
Qui peux s'écrire pour plus de clarté :
DECLARE @AvgTimeMaint_SEC INT = 42;
WITH [SRC] AS (
SELECT
RQT.RqtCode,
RQT.Dte,
CPY.CpyCode,
'Obj_Blabla' = dbo.GetNbObj(CPY.CpyInCde,100) * @AvgTimeMaint_SEC,
'Obj_Blabla2' = dbo.GetNbObj(CPY.CpyInCde,200) * @AvgTimeMaint_SEC,
'Obj_Blabla3' = dbo.GetNbObj(CPY.CpyInCde,300) * @AvgTimeMaint_SEC
FROM Request AS RQT
INNER JOIN Company AS CPY
ON RQT.OrigCpyInCde = CPY.CpyInCde
WHERE
... -- pas important ici
)
SELECT
[SRC].[RqtCode],
[SRC].[Dte],
[SRC].[CpyCode],
[SRC].[Obj_Blabla],
[SRC].[Obj_Blabla2],
[SRC].[Obj_Blabla3],
[SRC].[Obj_Blabla] + [SRC].[Obj_Blabla2] + [SRC].[Obj_Blabla3] AS [TotObjMaint]
FROM [SRC];