Dopo molte modifiche alla procedura memorizzata, ritengo che sia necessario eseguire nuovamente il factoring, principalmente a causa della duplicazione del codice. Come superare queste duplicazioni:Procedura memorizzata: riduzione della duplicazione del codice mediante le tabelle temporanee
IF @transExist > 0 BEGIN
IF @transType = 1 BEGIN --INSERT
SELECT
a.dayDate,
a.shiftName,
a.limit,
b.startTimeBefore,
b.endTimeBefore,
b.dayAdd,
b.name,
b.overtimeHours,
c.startTime,
c.endTime
INTO
#Residence1
FROM
#ShiftTrans a
RIGHT OUTER JOIN #ResidenceOvertime b
ON a.dayDate = b.dayDate
INNER JOIN ShiftDetails c
ON c.shiftId = a.shiftId AND
c.shiftTypeId = b.shiftTypeId;
SET @is_trans = 1;
END ELSE BEGIN
RETURN ;
END
END ELSE BEGIN
IF @employeeExist > 0 BEGIN
SELECT
a.dayDate,
a.shiftName,
a.limit,
b.startTimeBefore,
b.endTimeBefore,
b.dayAdd,
b.name,
b.overtimeHours,
c.startTime,
c.endTime
INTO
#Residence2
FROM
#ShiftEmployees a
RIGHT OUTER JOIN #ResidenceOvertime b
ON a.dayDate = b.dayDate
INNER JOIN ShiftDetails c
ON c.shiftId = a.shiftId AND
c.shiftTypeId = b.shiftTypeId;
SET @is_trans = 0;
END ELSE BEGIN
RETURN;
END
END;
IF @is_trans = 1 BEGIN
WITH CTE_Residence_Overtime_trans AS (
SELECT * FROM #Residence1
)
UPDATE t1
SET
t1.over_time = t1.over_time
+ CAST(RIGHT('0'+ CAST(overtimeHours as varchar(2)),2)
+':00:00' As Time)
+ CAST(RIGHT('0'+ CAST(@total_min as varchar(2)),2)
+':00:00' As Time),
t1.day_flag = t1.day_flag + 'R1',
t1.day_desc = 'R::'
+ CTE_Residence_Overtime_trans.shiftName +'[ '
+ CTE_Residence_Overtime_trans.name +' ]'
FROM
rr_overtime AS t1
INNER JOIN CTE_Residence_Overtime_trans
ON t1.[trans_date] = CTE_Residence_Overtime_trans.[dayDate]
WHERE
t1.emp_num = @empNum;
UPDATE rr_overtime
SET
over_time = CAST(RIGHT('0'+ CAST(0 as varchar(2)),2)+':00:00' As Time),
day_flag = day_flag +'R2'
WHERE
trans_date = @TomorrowDate AND
emp_num = @empNum;
END ELSE BEGIN
WITH CTE_Residence_Overtime AS (
SELECT * FROM #Residence2
)
UPDATE t1
SET
t1.over_time = CAST(RIGHT('0'+ CAST(overtimeHours as varchar(2)), 2)
+':00:00' As Time)
+ CAST(RIGHT('0'+ CAST(@total_min as varchar(2)),2)+':00:00' As Time),
t1.day_flag = t1.day_flag + 'R1',
t1.day_desc = 'R::'
+ CTE_Residence_Overtime.shiftName +'[ '
+ CTE_Residence_Overtime.name +' ]'
FROM
rr_overtime AS t1
INNER JOIN CTE_Residence_Overtime
ON t1.[trans_date] = CTE_Residence_Overtime.[dayDate]
WHERE
t1.emp_num = @empNum ;
UPDATE rr_overtime
SET
over_time = CAST(RIGHT('0'+ CAST(0 as varchar(2)),2)+':00:00' As Time),
day_flag = day_flag +'R2'
WHERE
trans_date = @TomorrowDate AND
emp_num = @empNum;
END
Quali duplicazioni stai ottenendo? –
@TabAlleman: sto parlando di duplicazione nel codice non nei dati. –
@just_name Va bene se si utilizzano alcune funzioni per evitare il calcolo duplicato – thangchung