高版本數據庫導出到低版本,sql2012到sql2005


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導出導入大容量數據。可以參閱我的另一篇博客《BCP導出導入大容量數據實踐》。

 

以上幾種方法是我在日常工作比較常使用的數據導出導入的工具,每一種方法都有各自的優勢和不同的使用場景,使用不同的方法組合,可以節省不少時間,提高工作效率,希望對您的有所幫助。如果您有更好的建議或方法歡迎告訴我!

 

 
 
標簽:  sqlserver導出導入


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM