2013-04-30 76 views
6

我試圖從.csv文件轉儲一個非常大的一組數據到SQL Server 2012數據庫。我正在調查bcp,而不是做數千個INSERT。BCP返回沒有錯誤,但也不復制任何行

編輯:這是一個自動化過程,而不僅僅是一次性。我也沒有這個數據庫的BULK INSERT權限。

當我嘗試將數據複製到數據庫中時,bcp不會返回任何錯誤,但實際上也不會複製任何內容 - 它僅返回0 rows copied。我已經減少了這個不起作用的最小情況。

首先,創建一個簡單的表有兩列:

CREATE TABLE [dbo].[mincase](
    [key] [varchar](36) NOT NULL, 
    [number] [int] NOT NULL 

    PRIMARY KEY CLUSTERED 
    (
     [key] ASC 
    ) 
    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 40) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

然後,使用bcp創建此格式文件。請注意,這個例子創建了一個XML格式的文件,但不管它是XML還是原生的。

bcp MyDB.dbo.mincase format nul -T -n -f mincasexml.fmt -x -S .\SQLEXPRESS 

現在創建一個data.csv文件,其中包含一行和兩個條目,以製表符分隔。在我的情況下,該文件就是:

somecharacters 12345 

再次,這是一個標籤,而不是兩個空格,這似乎並不重要,是否有尾隨換行還是不行。

現在嘗試使用bcp與格式文件,從這個文件中插入數據:

bcp MyDB.dbo.mincase in data.csv -f mincasexml.fmt -T -S .\SQLEXPRESS 

而不是複製數據到數據庫中,我得到這個:

Starting copy... 

0 rows copied. 
Network packet size (bytes): 4096 
Clock Time (ms.) Total  : 1 

有誰知道這裏發生了什麼?

謝謝!

+0

您是否嘗試了導入數據選項? – 2013-04-30 22:15:28

回答

8

bcp命令通常需要一個標識符來指定bcp文件的格式模式。

  • -c指定字符(明文)模式
  • -n指定本機模式
  • -w指定Unicode模式

在您的測試情況下,您所創建的文件是明文,所以你應在您的bcp in命令中指定'-c'。

bcp MyDB.dbo.mincase in data.csv -c -T -S .\SQLEXPRESS 

Microsoft Recommends使用「-n」進口和出口,以避免出現列值之內字段分隔符(見字符模式和本地模式的最佳實踐部分)的問題。

+1

就是這樣,有一個小編輯:-f覆蓋-c,因此完全刪除格式文件非常巧妙地解決了問題。最終結果如下: 'bcp MyDB.dbo.mincase in data.csv -c -T -S。\ SQLEXPRESS' – Mark 2013-04-30 23:11:24

+1

很好..修復我的答案。 – 2013-04-30 23:13:06

1

我遇到了類似的問題,除了我已經使用格式文件,所以添加一個格式標誌將無濟於事。對於任何最終在這裏結束的人,我想解釋是什麼導致了我的這個問題(並希望幫助解釋導致潛在問題的原因)。

問題在於BCP實際上並不處理文件中的文本行;相反,它只是根據您提供的說明處理數據流。 這意味着換行符將被忽略,如果這是您(意外)告訴BCP要執行的操作。

在我而言,這竟然是在格式文件的最後一行一個錯字:

13.0 
1348 
1 SQLCHAR 0 21 "," 1 RecordKey "" 
2 SQLCHAR 0 30 "," 0 SubmissionKey "" 
3 SQLCHAR 0 1 "," 2 A1cLvl "" 
... 
1347 SQLCHAR 0 1 "," 0 WoundIntVac "" 
1348 SQLCHAR 0 1 "/r/n" 0 XClampTm "" 

如果你仔細觀察,你會看到斜槓是向後終結者領域上最後一行。因此,BCP實際上是在查找數據流中的文本字符串「/ r/n」,而不是尋找Windows風格的行尾。

由於該字符串實際上並沒有出現在我的數據中,所以BCP從來沒有找到任何匹配我的最終字段的東西。所以,它是有道理的,它發現「0行」複製。

我仍然不確定爲什麼這不會導致類似於「遇到意外的EOF」錯誤或其他問題,但希望其他人能夠擴展此功能。

相關問題