一: 工作當中遇到更新較多數據時,使用循環(while,或游標)進行增刪改時,特別費時
WHILE @i <= @rows
BEGIN
SELECT @appNo = AppNumber, @roleid = RoleId, @statusi= Status, @empId = EmployeeId FROM #Atable WHERE ID = @i
IF EXISTS(SELECT 1 FROM Btable WHERE AppNumber = @appNo AND RoleID = @roleid AND EmployeeId = @empId)
BEGIN
UPDATE Btable
SET Status = @statusi, CreatedBy = NULL, ModifiedOn = GETDATE()
WHERE AppNumber = @appNoi AND RoleId = @roleidi AND EmployeeId = @empId
END
ELSE
BEGIN
INSERT INTO Btable(EmployeeId, AppNumber, RoleId, Status, CreatedOn, CreatedBy, ModifiedOn, ModifiedBy)
SELECT EmployeeId, AppNumber, RoleId, Status, GETDATE(), CreatedBy, GETDATE(), ModifiedBy FROM #Atable WHERE ID = @i
END
SELECT @i= @i + 1
END
二:利用表左、右連接進行批量刪除解決循環增刪改耗時長的問題
update aru set aru.Status = arul.Status, aru.ModifiedOn = GETDATE()
from Btable as aru
inner join Atable as arul
on aru.AppNumber = arul.AppNumber and aru.RoleId = arul.RoleId and aru.EmployeeID = arul.EmployeeID
三:A,B兩張表中有可能數據不相等,可以聲明兩個變量@count1,@count2
DECLARE @Count1 int,@Count2 int
select @Count1 = COUNT(1) from Atable
select @Count2 = COUNT(1) from Btable
四: 根據@count1和@count2的大小判斷是否新增還是刪除
IF(@Count1 > @Count2)
BEGIN
SELECT * INTO Btable
from Atable as arul
left join Btable as aru
on aru.AppNumber = arul.AppNumber and aru.RoleId = arul.RoleId and aru.EmployeeID = arul.EmployeeID
where aru.AppNumber is null and aru.RoleId is null and aru.EmployeeID is null
END
ELSE
BEGIN
update aru set aru.Status = 0
from Btable as aru
left join Atable as arul
on aru.AppNumber = arul.AppNumber and aru.RoleId = arul.RoleId and aru.EmployeeID = arul.EmployeeID
where arul.AppNumber is null and arul.RoleId is null and arul.EmployeeID is null
END
數據量較多時,又比較、又更新、又新增時,利用循環特別費時,批量更新的效率是循環的幾十倍甚至上百倍
個人工作中總結出來,如有轉載請注明出處!