【SQL SERVER中關於大容量數據的導入導出總結】


博文地址 請進: http://blog.csdn.net/feixianxxx/archive/2010/03/29/5427485.aspx

/*----------------------------------------------------------------
-- Author  :feixianxxx(poofly)
-- Date    :2010-03-29 14:04:14
-- Version:
--      Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86) 
Jul  9 2008 14:43:34 
Copyright (c) 1988-2008 Microsoft Corporation
Enterprise Evaluation Edition on Windows NT 6.1 <X86> (Build 7600: )
-- CONTENT:關於數據大容量的導入導出小結

----------------------------------------------------------------*/


1。關於大容量數據導入導出的一些方法
SQL SERVER提供多種工具用於各種數據源的數據導入導出,這些數據源包括本文文件、ODBC數據源、OLE DB數據源、ASCII文本文件和EXCEL電子表格。

2.常用工具
DTS:數據轉換服務導入導出向導或者DTS設計器創建DTS包
使用SQL SERVER復制發布數據
BCP命令提示實用工具實現SQL SERVER實例和數據文件之間的數據導入導出
BULK INSERT實現從數據文件導入數據到SQL SERVER實例
分布式查詢實現從一個數據源選擇數據插入到SQL SERVER實例
SELECT INTO 語句插入數據表

3.導入導出的數據
1。導入數據的目標表必須存在。導出數據的目標文件如果存在,則將重寫上面的內容。如果不存在,則BCP自動創建文件
2。數據文件中的數據必須是字符格式或是先前由bcp工具生成的格式(本機格式)
3。必須對相應的表擁有足夠的權限

4.數據導入導出工具的簡單用法


a.DTS
DTS是一組圖形工具和可編程對象,是開發者可以將取自完全的不同源的數據析取、轉換並合並成一個或者多個。
它的特點就是可以融合完全不同源的數據源 這在企業改進中應用很大 。
這里涉及到一個DTS包,它是一個有組織的鏈接、DTS任務、DTS轉換和工作流約束的集合。
關於DTS的操作請參看相關具體文獻。

b.BCP
它常用於將大量的數據從另外的程序轉移到SQL SERVER表中。當然也可以用於將表中數據傳輸到數據文件中。
下面是一些BCP的簡單用法(關於很多的選項使用看相關文檔)  
--前序,開啟xp_cmdshell 
--關於xp_cmdshell的一些知識 請看 http://blog.csdn.net/feixianxxx/archive/2009/08/14/4445603.aspx
EXEC sp_configure 'show advanced options', 1;RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE;
--環境
create table test
(
id int,
value varchar(100)
)
go
insert test values(1,'s1')
insert test values(2,'s2')
insert test values(3,'s3')
insert test values(4,'s4')
go
--1將表的數據導出到TEXT.txt文件中
exec master..xp_cmdshell 'bcp tempdb.dbo.test out e:\test.txt -c  -Usa -P123456'
--如果是WINDOWS身份 直接 xec master..xp_cmdshell 'bcp tempdb.dbo.test out e:\test.txt -T -c'

--2將TEXT.txt文件中的數據復制到test1表
select * into test1 from test where 1=2
exec master..xp_cmdshell 'bcp tempdb.dbo.test1 in e:\test.txt -c  -Usa -P123456'
select * from test1

--3將TEST表的ID字段復制到TEXT.txt中
exec master..xp_cmdshell 'bcp "SELECT id FROM tempdb.dbo.test" queryout e:\test.dat -T -c'

--4將test表中的第一行移動到text.txt中
exec master..xp_cmdshell 'bcp "SELECT top 1 * from tempdb.dbo.test "  queryout e:\test.txt -c  -Usa -P123456'

--關閉xp_cmdshell
EXEC sp_configure 'show advanced options', 1;RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 0;RECONFIGURE;


c.BULK INSERT 
它只能用於數據導入到SQL SERVER實例中,但是我們一般會選擇使用它,因為它比BCP使用工具快。
小例子:
--truncate table test
BULK INSERT tempdb..test
   FROM 'E:\test.txt'
   WITH 
      (
         FIELDTERMINATOR =',',--字段分割符號
         ROWTERMINATOR ='\n'--換行符號
      )
select * from test 
/*
id          value
----------- -----------
1            s1
2            asds
3            sadsa
100          2asda*/

ps:只寫最簡單用法,具體參數很多,參考MSDN

d.分布式查詢
--包含訪問 OLE DB 數據源中的遠程數據所需的全部連接信息。
--當訪問鏈接服務器中的表時,這種方法是一種替代方法,並且是一種使用 OLE DB 連接並訪問遠程數據的一次性的臨時方法。
--對於較頻繁引用 OLE DB 數據源的情況,請改為使用鏈接服務器。

--A.將 OPENROWSET 與 SELECT 和 SQL Server Native Client OLE DB 訪問接口一起使用(MSDN)
以下示例使用 SQL Server Native Client OLE DB 訪問接口訪問 TEST.A 表,該表位於遠程服務器 SERVER1 上的 POOFLY 數據庫中.
SELECT a.*
FROM OPENROWSET('SQLNCLI', 'Server=SERVER1;Trusted_Connection=yes;',
     'SELECT GroupName, Name, DepartmentID
      FROM POOFLY.TEST.A
      ORDER BY GroupName, Name') AS a;

--B. 使用 Microsoft OLE DB Provider for Jet(MSDN)
以下示例通過 Microsoft OLE DB Provider for Jet 訪問 Microsoft Access Northwind 數據庫中的 Customers 表。
SELECT CustomerID, CompanyName
   FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
      'C:\Program Files\Microsoft Office\OFFICE11\SAMPLES\Northwind.mdb';
      'admin';'',Customers)
GO

--c.使用 OPENROWSET 將文件數據大容量插入 varchar(max) 列中
/*
為了導入大型對象數據,OPENROWSET BULK 子句支持三個選項,允許用戶以單行或單列行集導入數據文件的內容。
你可以指定其中一個大型對象選項,而不是使用格式化文件。
大型對象選項包括:
SINGLE_BLOB 
以單行讀取 data_file 的內容,以 varbinary(max) 類型的單列行集返回內容。
SINGLE_CLOB 
以字符讀取指定數據文件的內容,以 varchar(max) 類型的單行、單列行集返回內容,使用的是當前數據庫的排序規則,例如文本或 Microsoft Word 文檔。
SINGLE_NCLOB 
以 Unicode 讀取指定數據文件的內容,以 nvarchar(max) 類型的單行、單列行集返回內容,並使用當前數據庫的排序規則。
*/
以下示例創建一個用於演示的小型表,並將名為 Text1.txt 的文件中的文件數據插入 varchar(max) 列中。
CREATE TABLE my_Test(Document varchar(max))
GO
INSERT INTO  my_Test 
 select * FROM OPENROWSET(BULK N'E:\test.txt', SINGLE_CLOB) AS Document
GO
select * from my_Test
/*
Document
-------------------------------------------------------   
ASDSADASDSADSADSAFKJHFAS HKLASJHASHBKDSAHKJDHSAKJDHSAKDHSAKDHSA
*/


e.SELECT INTO

關於這個的用法 相信大家都很清楚了 我就不說明了。


5。優化導入導出數據的一些方法

1。使用最小日志記錄:
a.恢復模式是簡單模式或者大容量日志記錄模式。如果你是完整模式,可以在進行操作前改成大容量日志模式,插入后改回來
b.目的表沒有觸發器,沒有索引,指定了TABLOCK

2。將數據從多個客戶端並行導入到單個表:
a.如果是完整恢復模式,改成大容量日志模式
b.指定了TABLOCK
c.表上沒有索引

3。使用批處理:通過設置BCP或者BULK INSERT的相關選項,是用於可以指定在操作過程中發給SQL的每個批處理的行數。

4。禁用觸發器和約束:默認情況下是禁用的。如果要檢查,可以在復制完成后進行一次更新操作(當然值不可以變) 

5。對數據文件中的數據排序:通過設置ORDER提示,提高性能。默認數據文件是不排序的。

6。控制鎖定行為:指定大容量操作過程獲得一個大容量更新表級鎖,這樣可以減少表上鎖的爭奪。
 
7。回避DEFAULT:通過設置相關選項,回避在復制數據到表中時,對有DEFAULT的列插入默認值,而是改成在列中值為NULL。
 

















122 个解决方案

#1


SFFF

#2


SFFFFFFFF

#3


sf不可以留的

#4


學習..

#5


大容量數據導入,如果需要驗證怎么處理?

#6


引用 5 樓 teli_eurydice 的回復:
大容量數據導入,如果需要驗證怎么處理?

你的驗證是 表上的約束和觸發器么?

#7


引用 5 樓 teli_eurydice 的回復:
大容量數據導入,如果需要驗證怎么處理?

如果是表上的約束驗證,BCP 和 BULK INSERT 都有相關的選項可以開啟 默認都是關閉的。

#8


一小撮不明真相的烤鴨路過並學習

#9


強力 支持 

#10


支持一下
學習了

#11


該回復於2010-07-28 10:56:01被版主刪除

#12


我飛過

#13


留個痕跡``

#14


...........

#15


學習。。。。

#16


學習!!!很有用!

#17


挺難的,學習

#18


飄過.....

#19


.............

#20


頂...

#21


好好好

#22


還是看不明白

#23


樓主NB

#24


你知道的太多了

#25


好像用BCP導入TXT文件,
Unicode編碼導入不進去,ANSI就可以。

#26


學習,學習

#27


學習,收藏!

#28


#29


#30


寫的真好!

#31


mark!學習一下!

#32


純打醬油的路過~

#33


本帖最后由 feixianxxx 於 2010-03-29 19:02:08 編輯
up

#34


SSIS

#35


不錯,收藏一個。

#36


頂,學習了

#37


還可以

#38


#39


ding...

#40


#41


輕輕我飛過.....

#42


學習學習,支持支持。。。。

#43


學習。。。

#44


學習了,謝謝樓主分享哦!

#45


xuexixuexi

#46


很好很強大

#47


阿彌陀佛
學習學習,
斷惡修善,災消福來.

#48


學習學習!
感謝樓主!

#49


好,值得學習。

#50


學習學習!
感謝樓主!

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com