最近公司要把B数据B表的数据从A数据库A表实时更新覆盖,我写了一个存储过程可以实现这个功能但是组长说我的做法要循环比对所有的数据,A,B两表也都要查询,觉得效率太低,耗时过长,他问我能不能直接select直接查询两个表不同的地方,然后进行修改这样子,减少执行时间,提高效率,希望各位大佬能够给出意见,谢谢大家,下面是我的源代码,和模拟的A表B表。
ALTER PROCEDURE [dbo].[QuaintTest]
@rtn int output
AS
DECLARE @Piece_Id INT, @Piece_PId INT ,@Piece_Level INT,@Piece_Time DATETIME
BEGIN
SET NOCOUNT ON;
DECLARE
@cuisor_b_val CURSOR --创建游标变量
DECLARE cursor_B CURSOR --创建动态游标
FOR SELECT Piece_Id,Piece_PId,Piece_Level,Piece_Time
FROM APiece; --创建游标接受结果集
OPEN cursor_B --打开游标
fetch next from cursor_B INTO @Piece_Id,@Piece_PId,@Piece_Level,@Piece_Time --into的变量数量必须与游标查询结果集的列数相同
--0,Fetch语句成功。
--1:Fetch语句失败或行不在结果集中。
--2:提取的行不存在。
WHILE @@FETCH_STATUS=0 --判断FETCH语句是否执行成功
BEGIN
if exists(select * from APPiece where Piece_Id=@Piece_Id)
begin
UPDATE dbo.APPiece SET Piece_PId = @Piece_PId,Piece_Level=@Piece_Level,Piece_Time=@Piece_Time where Piece_Id=@Piece_Id
set @rtn=1 --有身份证相同的数据,进行更新处理
end
else
begin
insert into dbo.APPiece(Piece_Id,Piece_PId,Piece_Level,Piece_Time) values(@Piece_Id,@Piece_PId,@Piece_Level,@Piece_Time)
set @rtn=2 --没有相同的数据,进行插入处理
end
fetch next from cursor_B INTO @Piece_Id,@Piece_PId,@Piece_Level,@Piece_Time --移动游标
END
CLOSE cursor_B --关闭游标
DEALLOCATE cursor_B; --释放游标
END