|
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 |