共計 1867 個字符,預計需要花費 5 分鐘才能閱讀完成。
本篇內(nèi)容介紹了“怎么用 SQL 吧數(shù)據(jù)表遷移到數(shù)據(jù)倉庫中”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓丸趣 TV 小編帶領(lǐng)大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!
需求背景
最近公司打算集中梳理幾大業(yè)務系統(tǒng)的數(shù)據(jù),希望將各個業(yè)務系統(tǒng)中的數(shù)據(jù)集中到數(shù)據(jù)倉庫中??偣灿?5000 多張數(shù)據(jù)表,但是好在業(yè)務數(shù)據(jù)量沒有像電商那么龐大,也就幾十個 G。
需求分析
其實這個需求很簡單,就是把這 5000 多張不同數(shù)據(jù)庫中的表放到一個地方。需要注意的有以下幾點:
1、數(shù)據(jù)來自各種不同類型的數(shù)據(jù)庫,有 SQL Server,MySQL 和 Oracle
2、表的數(shù)據(jù)量較多,一個一個寫查詢代碼肯定不現(xiàn)實
3、后續(xù)數(shù)據(jù)倉庫的維護
方案建議
由于數(shù)據(jù)量不是很大,我打算用 DBLINK 來實現(xiàn)從不同的庫中抽取數(shù)據(jù)到數(shù)據(jù)倉庫中。
方案思路
1、創(chuàng)建不同的 DBLINK
數(shù)據(jù)倉庫我們目前使用的是 SQL Server 的服務器,整體性能還可以。但是業(yè)務系統(tǒng)的數(shù)據(jù)庫類型不一,在新建 DBLINK 時有不同的要求:
a、針對 SQL Server 的業(yè)務數(shù)據(jù)庫可以直接在服務器上新建
b、針對 MySQL 和 Oracle 的業(yè)務數(shù)據(jù)庫需要先使用 ODBC 作用中間組件來配置。
2、查詢數(shù)據(jù)庫中的所有表表名
每個業(yè)務數(shù)據(jù)庫都是全庫抽取,那么首先需要找到這些數(shù)據(jù)庫中的所有表。這里我們以 SQL Server 為例來查找數(shù)據(jù)庫中的所有表。
SELECT NAME FROM SYSOBJECTS WHERE TYPE= U
上面的代碼就可以把當前庫中的所有表的表名都給查詢出來,我這里在家里電腦測試了一下,給大家看下截圖:
大家也可以在自己的電腦上試一試就知道了。
Oracle 獲取用戶表表名的代碼如下:
SELECT * FROM USER_TABLES;
MySQL 獲取用戶表表名的代碼如下:
select table_name from information_schema.tables where table_schema= db_name
3、循環(huán)抽取數(shù)據(jù)
我們在完成上面兩步后,就可以開始循環(huán)抽取各業(yè)務系統(tǒng)的數(shù)據(jù)了。這里我們需要寫一個游標來循環(huán)執(zhí)行。具體代碼如下:
DECLARE @TableName varchar(50),@Sql varchar(500) -- 定義兩個變量,一個用來存儲表名,一個用來存儲插入語句 DECLARE cursor_variable CURSOR FOR -- 定義一個游標,并且將目標表的所有表名插入游標中 select name from [192.168.0.39].[test].[dbo].sysobjects where xtype= u order by name; OPEN cursor_variable -- 打開游標 FETCH NEXT FROM cursor_variable INTO @TableName -- 獲取游標中的數(shù)據(jù)插入到變量中 WHILE @@FETCH_STATUS=0 -- 循環(huán)執(zhí)行,當游標中的數(shù)據(jù)被讀完為止 BEGIN SET @Sql= select * into dbo. +@TableName + from [192.168.0.39].[test].[dbo]. +@TableName Exec @Sql FETCH NEXT FROM cursor_variable INTO @TableName END CLOSE cursor_variable -- 關(guān)閉游標 DEALLOCATE cursor_variable; -- 釋放游標
目前只是測試代碼,后續(xù)在性能上還可以繼續(xù)優(yōu)化。
4、設(shè)置定時任務
代碼寫好了,肯定不可能每天手動去執(zhí)行,這時候我們可以使用數(shù)據(jù)庫的定時任務,這個我在以前的文章中有提到過。《數(shù)據(jù)庫任務自動化其實很簡單,JOB 的簡單介紹》
我們把代碼放到定時任務里面,讓它每天凌晨 1 點執(zhí)行即可。
總結(jié)
這個辦法在處理數(shù)據(jù)量不多的情況下是可行的,如果數(shù)據(jù)量較大,性能上會存在較大風險。下面我們回顧一下做了哪些內(nèi)容:
1、創(chuàng)建不同數(shù)據(jù)庫的 DBLINK
2、查詢到每個數(shù)據(jù)庫的所有表名
3、使用游標循環(huán)插入到數(shù)據(jù)倉庫
4、設(shè)置定時任務執(zhí)行上面的游標
每個步驟都可能會存在問題,但是只要把這些問題都解決了,這件事就解決了。
覺得不錯,記得轉(zhuǎn)發(fā)分享給更多人~
“怎么用 SQL 吧數(shù)據(jù)表遷移到數(shù)據(jù)倉庫中”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注丸趣 TV 網(wǎng)站,丸趣 TV 小編將為大家輸出更多高質(zhì)量的實用文章!