更新大数据量的效率问题
CREATE PROCEDURE sp_Attendance_UpdateArrangeWorkState
@StartDate nvarchar(50),
@EndDate nvarchar(50)
AS
BEGIN TRANSACTION
--更新正常上班打卡记录
--选择记录进行排序
CREATE TABLE #TempTable1
(
ID int IDENTITY PRIMARY KEY,
CardRecordID int,
AttendanceNo nvarchar(50),
EnterTime datetime,
PersonNo nvarchar(50)
)
INSERT INTO #TempTable1(CardRecordID,AttendanceNo,EnterTime,PersonNo)
SELECT DKJL.CardRecordID,DKJL.AttendanceNo,DKJL.EnterTime,RYJL.PersonNo
FROM AD_D_Data_A_DKJL DKJL
INNER JOIN AD_D_Data_A_RYJL RYJL
ON DKJL.AttendanceNo=RYJL.AttendanceNo
WHERE DKJL.Tag=0 ORDER BY DKJL.EnterTime ASC
UPDATE PBJL SET PBJL.State=1,PBJL.EnterTime=DKJL.EnterTime,PBJL.PersonNo2=DKJL.PersonNo
FROM AD_D_Data_A_PBJL PBJL,#TempTable1 DKJL
WHERE PBJL.PersonNo=DKJL.PersonNo
AND PBJL.WorkDate=CONVERT(char(10),DKJL.EnterTime,20)
AND PBJL.WorkTime>=CONVERT(char(8),DKJL.EnterTime,8)
AND DATEDIFF(minute, CONVERT(char(8),DKJL.EnterTime,8), PBJL.WorkTime)<=CONVERT(int,PBJL.EffectiveTime)
AND PBJL.WorkTag=0
AND CONVERT(char(10),DKJL.EnterTime,20)>=@StartDate
AND CONVERT(char(10),DKJL.EnterTime,20)<=@EndDate
--更新上班原始记录标识
UPDATE DKJL SET DKJL.Tag=1
FROM AD_D_Data_A_PBJL PBJL,AD_D_Data_A_DKJL DKJL,AD_D_Data_A_RYJL RYJL
WHERE DKJL.AttendanceNo=RYJL.AttendanceNo AND PBJL.PersonNo=RYJL.PersonNo
AND PBJL.PersonNo=RYJL.PersonNo
AND PBJL.WorkTag=0
AND PBJL.EnterTime= DKJL.EnterTime
--更新正常下班打卡记录
--选择记录进行排序
CREATE TABLE #TempTable2
(
ID int IDENTITY PRIMARY KEY,
CardRecordID int,
AttendanceNo nvarchar(50),
EnterTime datetime,
PersonNo nvarchar(50)
)
INSERT INTO #TempTable2(CardRecordID,AttendanceNo,EnterTime,PersonNo)
SELECT DKJL.CardRecordID,DKJL.AttendanceNo,DKJL.EnterTime,RYJL.PersonNo
FROM AD_D_Data_A_DKJL DKJL
INNER JOIN AD_D_Data_A_RYJL RYJL
ON DKJL.AttendanceNo=RYJL.AttendanceNo
WHERE DKJL.Tag=0 ORDER BY DKJL.EnterTime DESC
UPDATE PBJL SET PBJL.State=1,PBJL.EnterTime=DKJL.EnterTime,PBJL.PersonNo2=DKJL.PersonNo
FROM AD_D_Data_A_PBJL PBJL,#TempTable2 DKJL
WHERE PBJL.PersonNo=DKJL.PersonNo
AND PBJL.WorkDate=CONVERT(char(10),DKJL.EnterTime,20)
AND PBJL.WorkTime<=CONVERT(char(8),DKJL.EnterTime,8)
AND DATEDIFF(minute, PBJL.WorkTime, CONVERT(char(8),DKJL.EnterTime,8))<=CONVERT(int,PBJL.EffectiveTime)
AND PBJL.WorkTag=1
AND CONVERT(char(10),DKJL.EnterTime,20)>=@StartDate
AND CONVERT(char(10),DKJL.EnterTime,20)<=@EndDate
--更新上班原始记录标识
UPDATE DKJL SET DKJL.Tag=1
FROM AD_D_Data_A_PBJL PBJL,AD_D_Data_A_DKJL DKJL,AD_D_Data_A_RYJL RYJL
WHERE DKJL.AttendanceNo=RYJL.AttendanceNo AND PBJL.PersonNo=RYJL.PersonNo
AND PBJL.PersonNo=RYJL.PersonNo
AND PBJL.WorkTag=1
AND PBJL.EnterTime= DKJL.EnterTime
--更新不正常上班打卡记录
--选择记录进行排序
CREATE TABLE #TempTable3
(
ID int IDENTITY PRIMARY KEY,
CardRecordID int,
AttendanceNo nvarchar(50),
EnterTime datetime,
PersonNo nvarchar(50)
)
INSERT INTO #TempTable3(CardRecordID,AttendanceNo,EnterTime,PersonNo)
SELECT DKJL.CardRecordID,DKJL.AttendanceNo,DKJL.EnterTime,RYJL.PersonNo
FROM AD_D_Data_A_DKJL DKJL
INNER JOIN AD_D_Data_A_RYJL RYJL
ON DKJL.AttendanceNo=RYJL.AttendanceNo
WHERE DKJL.Tag=0 ORDER BY DKJL.EnterTime DESC
UPDATE PBJL SET PBJL.State=2,PBJL.EnterTime=DKJL.EnterTime,PBJL.PersonNo2=DKJL.PersonNo
FROM AD_D_Data_A_PBJL PBJL,#TempTable3 DKJL, AD_D_Data_A_GBAP GBAP
WHERE PBJL.PersonNo=DKJL.PersonNo
AND GBAP.WorkArrangeNo=PBJL.WorkArrangeNo
AND PBJL.WorkDate=CONVERT(char(10),DKJL.EnterTime,20)
AND CONVERT(char(8),DKJL.EnterTime,8)>GBAP.StartTime
AND CONVERT(char(8),DKJL.EnterTime,8)<GBAP.EndTime
AND PBJL.State=0
AND PBJL.WorkTag=0
AND CONVERT(char(10),DKJL.EnterTime,20)>=@StartDate
AND CONVERT(char(10),DKJL.EnterTime,20)<=@EndDate
--更新上班原始记录标识
UPDATE DKJL SET DKJL.Tag=1
FROM AD_D_Data_A_PBJL PBJL,AD_D_Data_A_DKJL DKJL,AD_D_Data_A_RYJL RYJL
WHERE DKJL.AttendanceNo=RYJL.AttendanceNo AND PBJL.PersonNo=RYJL.PersonNo
AND PBJL.PersonNo=RYJL.PersonNo
AND PBJL.EnterTime= DKJL.EnterTime
AND PBJL.WorkTag=0
--更新不正常下班打卡记录
--选择记录进行排序
CREATE TABLE #TempTable4
(
ID int IDENTITY PRIMARY KEY,
CardRecordID int,
AttendanceNo nvarchar(50),
EnterTime datetime,
PersonNo nvarchar(50)
)
INSERT INTO #TempTable4(CardRecordID,AttendanceNo,EnterTime,PersonNo)
SELECT DKJL.CardRecordID,DKJL.AttendanceNo,DKJL.EnterTime,RYJL.PersonNo
FROM AD_D_Data_A_DKJL DKJL
INNER JOIN AD_D_Data_A_RYJL RYJL
ON DKJL.AttendanceNo=RYJL.AttendanceNo
WHERE DKJL.Tag=0 ORDER BY DKJL.EnterTime ASC
UPDATE PBJL SET PBJL.State=2,PBJL.EnterTime=DKJL.EnterTime,PBJL.PersonNo2=DKJL.PersonNo
FROM AD_D_Data_A_PBJL PBJL,#TempTable4 DKJL, AD_D_Data_A_GBAP GBAP
WHERE PBJL.PersonNo=DKJL.PersonNo
AND GBAP.WorkArrangeNo=PBJL.WorkArrangeNo
AND PBJL.WorkDate=CONVERT(char(10),DKJL.EnterTime,20)
AND CONVERT(char(8),DKJL.EnterTime,8)>GBAP.StartTime
AND CONVERT(char(8),DKJL.EnterTime,8)<GBAP.EndTime
AND PBJL.State=0
AND PBJL.WorkTag=1
AND CONVERT(char(10),DKJL.EnterTime,20)>=@StartDate
AND CONVERT(char(10),DKJL.EnterTime,20)<=@EndDate
--更新下班原始记录标识
UPDATE DKJL SET DKJL.Tag=1
FROM AD_D_Data_A_PBJL PBJL,AD_D_Data_A_DKJL DKJL,AD_D_Data_A_RYJL RYJL
WHERE DKJL.AttendanceNo=RYJL.AttendanceNo AND PBJL.PersonNo=RYJL.PersonNo
AND PBJL.PersonNo=RYJL.PersonNo
AND PBJL.EnterTime= DKJL.EnterTime
AND PBJL.WorkTag=1
COMMIT TRANSACTION
GO
以上是更新考勤数据的存储过程,分4次筛选数据,上午上班,上午下班,下午上班,下午下班,
请问有没有执行效率高的方法?
多谢!
打卡记录表 AD_D_Data_A_DKJL
列名 数据类型 长度 允许空 备注 描述
CardRecordID int 4 主键 ID
AttendanceNo nvarchar 50 111130001 考勤编号
EnterTime datetime 8 2005-3-15 08:52:00 打卡时间
MachineNumber nvarchar 50 1 设备编号
InOutMode nvarchar 50 I 出入状态
Tag int 4 0默认值,1已筛选 筛选标识