1. 程式人生 > >資料遷移常用方法

資料遷移常用方法

SQL SERVER幾種資料遷移/匯出匯入的實踐

SQLServer提供了多種資料匯出匯入的工具和方法,在此,分享我實踐的經驗(只涉及資料庫與Excel、資料庫與文字檔案、資料庫與資料庫之間的匯出匯入)。

(一)資料庫與Excel

方法1:

使用資料庫客戶端(SSMS)的介面工具。右鍵選擇要匯出資料的資料庫,選擇“任務”——“匯出資料”,下圖1,按照嚮導一步一步操作即可。而匯入則相反,匯入時,SQLServer會預設建立一張新表,欄位名也預設跟匯入的Excel標題一樣,並且會預設欄位資料型別等。當然在可以在嚮導進行修改。需要注意的是如果標題不是英文而是中文,預設建立欄位名也是中文,這將給後面資料更新操作帶來麻煩,所以最好還是以有意義的英文欄位名。把資料匯入後,再通過執行語句,把資料插入/更新到業務表。

 figure-1:任務——匯出資料

 

方法2:

從SQLServer2005開始,可以直接在SSMS上查詢出來的結果複製,然後貼上到Excel上,對於少量資料來說,是非常快速方便的,需要注意的是長數字可能會變成科學記數法的形式,提前在Excel上指定列的格式為文字即可。

匯入的話,ctrl + c 複製Excel上的資料,然後在選擇相關表,編輯資料,把資料直接貼上上去即可。但是不建議直接貼上到業務表(如果表是空白沒有資料,並且欄位順序對應,可以這樣操作),而是建議先貼上到一個新建的中間表中,然後再通過語句,把資料插入/更新到業務表。

這種方法的匯出匯入,適合於少量的資料,如5000行以內的記錄,大於5000行以上就不建議了,速度較慢,如果資料過大,還一定成功。

 

 

(二)資料庫與文字檔案、資料庫與資料庫

資料庫之間的資料遷移或匯出匯入其實是比較方便的,比如備份資料庫後,在新的機器上做恢復。但是需要注意的是SQL2008之前的版本的備份無法在SQL2012或以上版本上直接恢復的,而是通過中間的SQL2008做一個過渡,把舊版本的資料庫恢復到SQL2008,然後做備份,最後在SQL2012上恢復。

如果是新版本(下面以SQL2012為例)的備份檔案恢復到舊版本(以SQL2008為例)上就比較麻煩了,一般是不支援新版本備份檔案在舊版本中恢復的。只能通過編寫指令碼,把新版本的資料匯入到舊版本中。

 

方法1:

首先推薦使用的是資料不落地的“連結伺服器”。使用SQL2012的SSMS,同時連線到SQL2012和SQL2008的例項,通過編寫指令碼把SQL2012的資料匯入到SQL2008中。兩個例項的可以通過連結伺服器來連線。以下是設定步驟。

figure-2:新建連結伺服器

 

figure-3:連結伺服器和資料來源

 

figure-4:認證

 

figure-5:建立成功後,可以直接瀏覽連結伺服器的目錄,也可以使用語句查詢了。

 

也可以使用指令碼來建立連結伺服器。

複製程式碼

--建立連結伺服器
EXEC sp_addlinkedserver 
@server='LINKED_SERVER_TEST2',--被訪問的伺服器別名
@srvproduct='',
@provider='SQLOLEDB',
@datasrc='192.168.88.6,11433'--資料來源
GO

--建立登入名和密碼
EXEC sys.sp_addlinkedsrvlogin
@rmtsrvname = 'LINKED_SERVER_TEST2', -- 被訪問的伺服器別名
@useself = 'false',
@locallogin = NULL,
@rmtuser = 'sa', -- 資料來源登入名
@rmtpassword = 'psd123456' -- 資料來源登入密碼
GO

--設定資料可以訪問
EXEC sys.sp_serveroption
@server = 'LINKED_SERVER_TEST2', 
@optname = 'data access',
@optvalue = N'true'
GO

複製程式碼

code-1:建立連結伺服器的指令碼

 

建立成功後,可以直接查詢資料。

figure-6:查詢連結伺服器的資料

 

通過檢視sys.servers可以查詢所有伺服器及相關的屬性。

figure-7:查詢所有連結伺服器

 

在SSMS上或執行以下指令碼可以刪除指定的連結伺服器。

--刪除連結伺服器及所有登入
EXEC sys.sp_dropserver
 @server = 'LINKED_SERVER_TEST2',
 @droplogins = 'droplogins'
 GO

 code-2:刪除連結伺服器及所有登入

 

詳細請參考:https://technet.microsoft.com/zh-cn/library/ff772782%28v=sql.105%29.aspx

 

 

方法2:

如果兩個例項不能連線,只能在SQL2012上匯出資料,再到SQL2008上匯入。SQLServer提供生成包含資料的指令碼工具,下圖2。在第三步的“高階”選項裡有一項“Types of data to scripts”有三個選擇:Data only,Schema and data,Schema only,分別是隻生成資料、生成表(物件)和資料,表(物件)。還有生成指令碼的版本“Script for Server Version”,下圖3。其他選項,按實際需要選擇。

 

 figure-8:任務——生成指令碼

 

figure-9:生成指令碼的高階選項

 

也可以使用儲存過程生成包含資料的指令碼。這裡介紹一個別人已經做寫好儲存過程:sp_generate_inserts。執行之後,會按表每條記錄生成一條insert的語句

 View Code

code-3:sp_generate_inserts指令碼原始碼

 

在我的實際使用中,只有兩三個引數比較常用,分別是@table_name、@from和@owner,如果表的架構使用預設的dbo,則可以省略。以下是一個使用的例子:

figure-10:使用sp_generate_inserts的一個例子

 

其他引數的用法,這裡就不一一解釋了。我經常使用這個儲存過程做一些簡單而少量(如數萬行記錄以內)的資料匯出匯入,比前面介紹的方法方便快捷許多。但這個儲存過程支援處理一般常用的資料型別,像XML這種型別則不支援。還有,如果生成的資料太多太大,SSMS返回資料會很慢,甚至SSMS會掛了,這時還是使用SSMS自帶的匯出指令碼到檔案穩妥些。如果使用生成的資料指令碼檔案很大,幾百MB甚至上GB,在匯入時,就不能直接使用SSMS直接開啟來執行了。可以使用SQLCMD實用工具來在執行指令碼。如下面的一個例子,在D盤下有一個指令碼1.sql,內容為:

USE AdventureWorks2008R2
GO
SELECT * FROM Person.CountryRegion;
GO

code-4:SQLMCD的測試指令碼

 

在執行下輸入CMD,輸入:

sqlcmd -S localhost -d AdventureWorks2008R2 -i D:\1.sql

code-5:SQLMCD的命令

 

回車執行後如下圖,SQLCMD的詳細用法,請參考:https://msdn.microsoft.com/zh-cn/library/ms180944.aspx

和 https://msdn.microsoft.com/zh-cn/library/ms162773%28v=sql.105%29.aspx

 

 figure-11:SQLCMD的測試例子

 

 

方法3:

使用BCP匯出匯入大容量資料

原文地址:https://www.cnblogs.com/fishparadise/p/4592789.html