CREATE PROCEDURE p_org_Extract AS DECLARE @sql VARCHAR(3000) BEGIN DECLARE @BeginDate DATETIME, @EndDate DATETIME, @TaskName VARCHAR(32), @Flag INTEGER, @Num INTEGER, @CurrDate DATETIME SELECT @Num = COUNT(TaskName) FROM ExtractTaskList WHERE UPPER(TaskName) = UPPER('test') IF @Num != 1 INSERT INTO ExtractTaskList(TaskName,IncType,TransType) VALUES('test',2,2) -- 获取列表中的当前任务的时间戳和状态 SELECT @BeginDate = SourceDate,@Flag = Flag FROM ExtractTaskList WHERE TaskName='TEST' -- 如果上次执行未成功,这样取值效率会高一些,则从数据仓库表中直接读取 --TargetDate 和 SourceDate 可能会不一致 IF @Flag = 2 OR @Flag IS NULL SELECT @BeginDate = DATEADD(ss,1,MAX(closedate)) FROM TargetTable -- 如果数据仓库无数据,则从业务系统中直接读取,也可以设置一个默认的初始化时间 IF @BeginDate IS NULL SELECT @BeginDate = MinLogDate FROM OPENQUERY(SOURCE,'SELECT MIN(CloseDate) AS MinLogDate FROM SourceTable') -- 如果仍无数据,则表示无数据可抽取,退出执行 IF @BeginDate IS NULL RETURN -- 抽取结束时间为当前时间前一天 , 每次循环抽取 1 天数据 , 可以更改 dd 为 hh ,变成按小时抽取 -- 通常业务系统是连续的,如果有疑问也可以从业务系统中获取最大时间 SELECT @EndDate = CONVERT(DATETIME,LEFT(CONVERT(VARCHAR,GETDATE(),120),10)+' 00:00:00') -- 更新当前开始时间和结束时间 UPDATE ExtractTaskList SET TargetDate = @BeginDate, SourceDate = @EndDate WHERE UPPER(TaskName) = UPPER('test') WHILE @BeginDate < @EndDate BEGIN SELECT @sql = ' INSERT INTO TargetTable ( ID1, ID2, Measure1, Measure2, CloseDate )SELECT * FROM OPENQUERY(SOURCE,''select ID1, ID2, Measure1, Measure2, CloseDate FROM SourceTable WHERE CloseDate >= TO_DATE(''''' + CONVERT(varchar,@BeginDate,120) + ''''', ''''YYYY-MM-DD HH24:MI:SS' + ''''') AND CloseDate < TO_DATE(''''' + CONVERT(varchar,DATEADD(day,1,@BeginDate),120) + ''''', ''''yyyy-mm-dd HH24:MI:SS' + ''''') AND CloseDate < TO_DATE(''''' + CONVERT(varchar,@EndDate,120) + ''''', ''''YYYY-MM-DD HH24:MI:SS' + ''''')'')' --PRINT @sql EXEC (@sql) -- 获取本次任务运行抽取的最大时间 IF DATEADD(day,1,@BeginDate)>@EndDate SELECT @CurrDate = @EndDate ELSE SELECT @CurrDate = DATEADD(day,1,@BeginDate) -- 如果 @sql 执行失败,同样记录状态和时间 IF @@ERROR <> 0 GOTO FAIL -- 记录每次运行的时间运行情况,可提供相应参考 UPDATE ExtractTaskList SET TargetDate = @CurrDate, Flag = 1 WHERE UPPER(TaskName) = UPPER('test') SELECT @BeginDate = DATEADD(DD,1,@BeginDate) END RETURN FAIL: -- 记录错误 UPDATE ExtractTaskList SET TargetDate = @CurrDate, Flag = 2 WHERE UPPER(TaskName) = UPPER('test') RETURN 0 END |