sql – 存储过程:使用临时表减少代码重复
发布时间:2020-12-12 06:53:34 所属栏目:MsSql教程 来源:网络整理
导读:在对我的存储过程进行了许多更改之后,我认为它需要重新分解,主要是因为代码重复.如何克服这些重复: 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.o
在对我的存储过程进行了许多更改之后,我认为它需要重新分解,主要是因为代码重复.如何克服这些重复:
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,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)),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)),day_flag = day_flag +'R2' WHERE trans_date = @TomorrowDate AND emp_num = @empNum; END 解决方法您可以尝试以下操作以避免重复.基本上首先创建你的临时表(我已经猜到了数据类型),然后只使用这个表作为插入,因为你正在使用if它将是插入到其中的一个或另一个.那么如果您从表中执行Select *,则不需要CTE,因此只需从表中直接调用即可.由于该表只包含一个选择或另一个的数据,并且字段名称相同等,我们可以只使用一个更新,如果是,则不再需要: Create table #Residence (dayDate varchar(9),shiftName varchar(20),limit int,startTimeBefore time,endTimeBefore time,dayAdd int,name varchar(30),overtimeHours int,startTime time,endTime time) IF @transExist > 0 BEGIN IF @transType = 1 --INSERT BEGIN Insert into #Residence SELECT a.dayDate,c.endTime 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; END ELSE BEGIN RETURN ; END END ELSE BEGIN IF @employeeExist > 0 BEGIN Insert into #Residence SELECT a.dayDate,c.endTime 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; END ELSE BEGIN RETURN ; END END; 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)),t1.day_desc = 'R::' +R.shiftName +'[ '+ R.name +' ]' FROM rr_overtime AS t1 INNER JOIN #Residence R ON t1.[trans_date] = R.[dayDate] WHERE t1.emp_num = @empNum ; UPDATE rr_overtime SET over_time = CAST(RIGHT('0'+ CAST(0 as varchar(2)),day_flag = day_flag +'R2' WHERE trans_date = @TomorrowDate AND emp_num = @empNum; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
- 一只查询SQLServer 2005所有信息的语句
- SQL Server:UNION数量的限制是多少?
- sql-server – 如何启用到SQL Server实例的加密连
- sql-server – 捕获在SQL Server扩展会话中传递的
- sql-server – 带CDATA的SQL Server XML输出
- 有一个轻量级,可嵌入的键/值数据库? (喜欢饮食c
- sql-server – SQL Server 2005中的SORTING分层查
- [MSSQL]sqlserver数据库出现置疑的解决办法
- 对于Hibernbate SQLServer 2008 No Dialect mapp
- sql-server – 在数据库字段中存储数字数组
热点阅读