使用bcp工具導入和導出批量數據

 用bcp工具導入數據

  一個最簡單的操作就是你可以用bcp工具將數據從SQL Server表bulk-copy到文本文件。在 Windows命令提示符中插入命令,你就可以運行bcp命令了。例如以下命令,從 AdventureWorks數據庫裏的Sales.vSalesPerson視圖複製數據到C:/Data/SalesPerson.txt文件:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->  bcp AdventureWorks.Sales.vSalesPerson out C:/Data/SalesPerson.txt -c –T

  如同你看到的一樣,bcp命令以工具名稱開頭,後面爲完全合格表名database.schema.table。接下來就是out 關鍵字,關鍵字告訴bcp工具數據將會從該表中導出。目標文本文件的路徑和文件名稱緊跟out 關鍵字之後。注意本文中列出的命令例子可能包括很多行,但是所有的例子應該像一個單獨的命令一樣運行。

  除了這些基本參數,bcp工具還支持控制工具行爲的switch。在以上例子中,無論數據是以何種方式存儲在源表中的,-c switch表示所有的數據都應是字符數據。如果你沒有指定-c開關或其他相關類型的switch,你就需要在進入bcp命令後指定每個列的switch類型。

  上述例子中另一個switch就是-T,它主要是告訴bcp工具使用可靠連接來關聯SQL Server示例。如果你沒有指定-T,你就必須提供用戶名(-U switch)和密碼(-P switch),或者你需要提供相關信息。

  因爲在先前列舉的例子中沒有指定實例,bcp工具就在本地機上使用的默認實例。要指定一個SQL Server實例,就要用到-S switch,後面緊跟的是服務器名稱,如下所示:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->  bcp AdventureWorks.Sales.vSalesPerson out C:/Data/SalesPerson.txt -c -T -

  S Server01

  Bcp工具現在和Server01上的默認實例連接。如果你想連接到具體實例而不是默認的實例,你就必須指定實例名稱和服務器名稱,如Server01/SqlSrv。 通過默認,bcp工具使用製表符分隔目標文件中裏的域。但你也可以用-t switch調過這一操作,如下:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->  bcp AdventureWorks.Sales.vSalesPerson out C:/Data/SalesPerson.csv -c -

  T
-t,

  在這種情況下,-t switch後有一個逗號,意思就是說數據域現在由逗號分開。這樣做可讓你講數據保存到.csv 文件,便於你在Microsoft Excel文件中查看這些數據。 以上一些例子只限於將數據從表中導出。但是你還可以用bcp命令運行Transact-SQL查詢、到出查詢條件。例如以下bcp命令,包括只從vSalesPerson視圖中檢索SalesPersonID、FirstName和LastName的SELECT語句:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->  bcp "SELECT SalesPersonID, FirstName, LastName FROM AdventureWorks.Sales.vSalesPerson"

  queryout C:/Data/SalesPerson.csv
-c -T -t,

  這種情況下引號裏的查詢通過的是bcp命令而不是表名稱。此外,queryout取代了out關鍵字。但是命令其他部分和先前的例子相同。結果,SalesPerson.csv文件現在只包含三個指定列。你還可以讓查詢更加精煉:例如你可以包括限定只從源表中返回那些行的WHERE子句。

  用bcp工具導出數據

  Bcp工具使得導入數據和導出一樣簡單。要在這部分裏運行這個示例,首先就要執行下面的T-SQL腳本,在AdventureWorks數據庫裏創建SalesPeople表:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->  USE AdventureWorks

  
GO

  
IF OBJECT_ID (N'SalesPeople', N'U') IS NOT NULL

  
DROP TABLE dbo.SalesPeople

  
GO

  
CREATE TABLE dbo.SalesPeople (

  SalesPersonID
INT IDENTITY PRIMARY KEY,

  FirstName
NVARCHAR(50) NOT NULL,

  LastName
NVARCHAR(50) NOT NULL

  )

   要導出數據,你需要一個源文件從中複製數據。例如下面的命令就用了最近創建的SalesPerson.csv文件加載數據到SalesPeople表:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->  bcp AdventureWorks.dbo.SalesPeople in C:/Data/SalesPerson.csv -c -T -t,

  首先,你必須指定目標表,這種情況下緊跟其後的爲代替out或queryout的in關鍵字。其次,你必須指定源文件的路徑和文件名稱,後跟任意可用的switch。在運行這一命令並查看結果時,要注意源文件如果包括售貨員的ID,這些值就不能插入到SalesPersonID列。該列定義爲IDENTITY列,這樣我們就可以忽視源數據。要保留

  原始值,你就必須在命令裏增加-E switch,如下面的例子中所示:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->  bcp AdventureWorks.dbo.SalesPeople in C:/Data/SalesPerson.csv -c -T -t, -E

  現在表中就包含了你想要得到的數據。

  使用格式文件

  在導入或導出數據時,你會發現源數據架構和目標數據架構不匹配。例如,文本文件中的這些列可能和目標表中的列的順序不一致,或者說這些列的多少還不一樣。你可以通過創建格式文件映射源文件和目標架構解決這個問題。我們通過以下示例看看它是如何工作的:

  假如你使用了以下命令從 vSalesPerson視圖中導出數據到SalesPeople.txt文件:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->  bcp "SELECT LastName, FirstName, SalesPersonID FROM AdventureWorks.Sales.vSalesPerson"

  queryout C:/Data/SalesPeople.txt
-c -T -t,

  該命令使用了先前例子中同樣的參數。但是注意這些列從視圖中檢索的順序:LastName、FirstName、最後是SalesPersonID。 現在假設你打算使用該文件導入數據到SalesPeople表。SalesPeople表中列的順序和文本文件中列順序不同。要解決這個問題,你可以創建一個格式文件將這些列從源文件映射到目的文件。以下命令說明如何創建一個格式文件:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->  bcp AdventureWorks.dbo.SalesPeople format nul -f C:/Data/SalesPeople.fmt -

  c
-T -t,

  先前的例子表明,命令首先指定了目標表。而這一次表明後面爲關鍵字format nul,表示bcp工具應該創建格式文件。-f參數用於指定格式文件的路徑和文件名稱,其後爲switch。最後在你運行該命令時,就生成了包括SalesPeople表架構的格式文本。

  下面的數據顯示上述命令生成的SalesPeople.fmt格式文本內容:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->  10.0

  
3

  
1 SQLCHAR 0 12 "," 1 SalesPersonID ""

  
2 SQLCHAR 0 100 "," 2 FirstName SQL_Latin1_General_CP1_CI_AS

  
3 SQLCHAR 0 100 "/r/n" 3 LastName SQL_Latin1_General_CP1_CI_AS

  文件(10.0)第一行確定了目前使用的bcp版本。第二行(3) 確定了表中的列數,接下來的三行爲列的相關信息:

  ·第一個域爲列在源文件中出現的順序。

  ·第二個域顯示每個列的源文件數據類型。因爲在生成文件時指定了–c switch,在從數據文件中提取時,所有的域都用字符型數據類型。插入數據時,SQL Server會將數據轉換到正確的類型。

  ·第三個域表示域的前綴長度,SQL Server通常會用它來提供最緊湊的文件存儲。在創建格式文件時如果你指定-c switch,那麼就會自動用到0。

  ·第四個域代表特殊域數據類型字節長度。

  ·第五個域表明如何終止行和列。由於在創建格式文件時用了-t switch,源文件的域值就必須通過逗號終止。

  ·第六個域映射這些列在SQL Server表中的排列順序。

  ·第七個和最後一個域提供了SQL Server表中字符列的整理信息。

  要用格式文件將數據導入SalesPeople表中,我們必須如下修改文件:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->  10.0

  
3

  
1 SQLCHAR 0 100 "," 3 LastName SQL_Latin1_General_CP1_CI_AS

  
2 SQLCHAR 0 100 "," 2 FirstName SQL_Latin1_General_CP1_CI_AS

  
3 SQLCHAR 0 12 "/r/n" 1 SalesPersonID ""

   你可以看到,列的順序已經進行了修改,這一順序就是它們在格式文件中的排列順序。SalesPersonID列現在排在最後,並且以/r/n結尾。LastName列現在排在開頭並且以逗號結尾。

  修改、保存格式文件後,準備在bcp命令中用了。下面的例子說明如何調用格式文件:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->  bcp AdventureWorks.dbo.SalesPeople in C:/Data/SalesPeople.txt -

  f C:/Data/SalesPeople.fmt –T

   注意,你從SalesPeople.txt文件中導入數據時,還必須用到-f switch調用格式文件。還要注意到你現在已經不需要包括-t 和-c switch,因爲現在在格式文件中已經包括了這些信息。

  無論你用的是格式文件還是隻運行基本命令,你現在都應該更好地瞭解到瞭如何使用bcp工具。記住bcp工具支持的switch比我所列舉的要多得多。同時,本技巧還提供了有關啓用bcp工具、輕鬆將數據導入到SQL Server表以及導出數據到文本文件的比較充足的信息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章