2016-02-14 40 views
0

我試圖從csv加載數據到SQL表中。大容量加載數據轉換錯誤

我DDL:

CREATE TABLE pcm.dbo.partitiondocumentcount 
    ( 
     partitionkey NVARCHAR(30) NOT NULL, 
     documentcount INT NOT NULL, 
     datetime  DATETIME2(3) DEFAULT CURRENT_TIMESTAMP, 
     CONSTRAINT pk_partitiondocumentcount PRIMARY KEY (partitionkey ASC) 
    ) 

    CREATE NONCLUSTERED INDEX partitionkey_index 
    ON pcm.dbo.partitiondocumentcount (partitionkey AS 

我的文件(我也試過不帶引號,沒有工作以及):

"partition-1",1 
"partition-2",1 

我的查詢:

BULK INSERT partitionDocumentCount 
FROM 'C:\files\pcmInitialConfiguration\partitionCount.csv' 
WITH(
    FIELDTERMINATOR = ',', 
    ROWTERMINATOR = '\n' 
) 
GO 
SELECT * FROM partitionDocumentCount 

我從DBVisualizer得到錯誤:

15:36:26 [BULK - 0 row(s), 0.008 secs] [Error Code: 4864, SQL State: S0001] Bulk load data conversion error (type mismatch or invalid character for the specified codepage) for row 1, column 2 (documentcount). 
15:36:26 [SELECT - 0 row(s), 0.004 secs] Empty result set fetched 
... 2 statement(s) executed, 0 row(s) affected, exec/fetch time: 0.012/0.000 sec [0 successful, 1 warnings, 1 errors] 
+0

也許你有一個平直行,或是在文件標題? – Jens

回答

0

溶液只需添加一列 。 我猜想,因爲我的表有三列,它預計在文件中有三列。

我的文件(我也試過不帶引號,沒有工作以及): 這裏的工作一個

partition-1,1, 
partition-2,1, 
1

我看到你的方法有一個問題,但我不知道它會產生這個錯誤。該表有三列,但您的數據只有兩列。即使使用default約束,bulk insert仍會查找第三列。它可能會得到該錯誤,因爲它正在查找逗號,但遇到行尾。

到的解決方案是使用一種觀點:

create view pcm.dbo.partitiondocumentcount_2 as 
    select partitionkey, documentcount 
    from pcm.dbo.partitiondocumentcount; 

然後:

BULK INSERT partitionDocumentCount_2 
FROM 'C:\files\pcmInitialConfiguration\partitionCount.csv' 
WITH (FIELDTERMINATOR = ',', 
     ROWTERMINATOR = '\n' 
    ); 
+0

是的。感謝您的觀點解決方案,非常有創意。我傾向於添加一個逗號來表示一個新的空列,SQL似乎知道這一點,並使用默認值 –

+0

@AlexChaplianka。 。 。這種情況恰好適用於這種情況,但這通常不是一個可行的解決方案(CSV文件可能相當大)。另外,我認爲你不能以這種方式輸入「身份」。 –