加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

关于数据增量抽取的模拟实现——脚本实现

发布时间:2020-12-12 15:32:44 所属栏目:MsSql教程 来源:网络整理
导读:原创于2006年12月30日,2009年10月15日迁移至此。 本文主要是针对关于数据增量抽取的模拟实现——原理 进行实现的 实现的环境: 业务数据库:Oracle9i 数据仓库数据库:SQLServer2000 1、前提SQLServer服务器已经安装Oracle驱动,不再详细累述 2、创建链接数

-- 创建 Oracle 业务系统表结构

CREATE TABLE SourceTable
(
ID1 VARCHAR2(50),
ID2 VARCHAR2(50),
Measure1 INTEGER,
Measure2 INTEGER,
CloseDate DATE
)

-- 创建测试数据

DECLARE

-- Local variables here
i INTEGER;

BEGIN

-- Test statements here

FOR i IN 1..365 LOOP

INSERT INTO SourceTable
VALUES(i,i,TO_DATE('2006-01-01','yyyy-mm-dd')+i);
INSERT INTO SourceTable
VALUES(i,TO_DATE('2006-01-01 12:00:00','yyyy-mm-dd hh24:mi:ss')+i);

END LOOP
COMMIT;

END;


4、创建SQLServer数据仓库环境脚本

-- 创建系统参数表内

CREATE TABLE ExtractTaskList (
TaskName VARCHAR(32),
TargetTable VARCHAR(32),
TargetFieldList VARCHAR(500),
SourceTable VARCHAR(32),
SourceFieldList VARCHAR(500),
WhereFieldName VARCHAR(32),
IncType INT,
TransType INT,
TargetDate DATETIME,
SourceDate DATETIME,
Flag INT,
Note VARCHAR (500)
)

GO

-- 创建数据仓库目标表

CREATE TABLE TargetTable (
ID1 VARCHAR(50),
ID2 VARCHAR(50),
Measure1 DECIMAL(18,0),
Measure2 DECIMAL(18,
CloseDate DATETIME
)

GO


5、创建SQLServer数据仓库ETL脚本
脚本考虑到现实的问题,已经做了许多取舍,不再追求全部动态实现,旨在给定一个模板,在有限的范围内可以更改每次抽取的周期,每次时间的跨度,抽取的字段,表等等;数据字典表仅仅利用了其中的四个字段:任务名称,当前抽取时间、结束时间、抽取状态。

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,
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,@BeginDate),''''yyyy-mm-dd HH24:MI:SS'
+ ''''') AND CloseDate < TO_DATE(''''' + CONVERT(varchar,@EndDate,''''YYYY-MM-DD HH24:MI:SS'
+ ''''')'')'
--PRINT @sql
EXEC (@sql)

-- 获取本次任务运行抽取的最大时间
IF DATEADD(day,@BeginDate)>@EndDate
SELECT @CurrDate = @EndDate
ELSE
SELECT @CurrDate = DATEADD(day,@BeginDate)

-- 如果 @sql 执行失败,同样记录状态和时间
IF @@ERROR <> 0
GOTO FAIL

-- 记录每次运行的时间运行情况,可提供相应参考
UPDATE ExtractTaskList
SET TargetDate = @CurrDate,
Flag = 1
WHERE UPPER(TaskName) = UPPER('test')

SELECT @BeginDate = DATEADD(DD,@BeginDate)

END

RETURN

FAIL:

-- 记录错误

UPDATE ExtractTaskList
SET TargetDate = @CurrDate,
Flag = 2
WHERE UPPER(TaskName) = UPPER('test')

RETURN 0

END

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

原创于2006年12月30日,2009年10月15日迁移至此。


本文主要是针对关于数据增量抽取的模拟实现——原理 进行实现的

实现的环境:

业务数据库:Oracle9i

数据仓库数据库:SQLServer2000


1、前提SQLServer服务器已经安装Oracle驱动,不再详细累述
2、创建链接数据库
打开企业管理器->安全性-链接服务器-右键新建

数据仓库


通常情况当链接数据库创建好,进行打开的时候都会弹出一下错误窗口:

数据仓库


一般情况下运行C:Program FilesCommon FilesSystemOle DBmtxoci81_win2k.reg该文件后,重启SQLServer数据库,再重新连接;
如果仍有问题,重启操作系统,即可OK。
3、创建Oracle环境脚本

    推荐文章
      热点阅读