2014-09-25 20 views
0

BCP是經常讓我感到困擾的事情,經過大量嘗試,我正在建立一個簡單的測試,導致「無效的字符值用於投射規範」錯誤。似乎無法找出問題所在。使用xml格式文件將BCP文件導入到SQL表中導致錯誤

首先,我有一個SQL Server表

CREATE TABLE [dbo].[customDataFromAPI](
    [id] [int] IDENTITY(1,1) NOT NULL, 
    [periodStartUTC] [datetimeoffset](7) NULL, 
    [M1] [nvarchar](50) NULL, 
    [M2] [nvarchar](50) NULL, 
    [M3] [nvarchar](50) NULL, 
    [M4] [nvarchar](30) NULL, 
    [M5] [nvarchar](40) NULL, 
    [M6] [nvarchar](30) NULL, 
    [M7] [bigint] NULL, 
    [M8] [bigint] NULL, 
CONSTRAINT [PK_customDataFromAPI] PRIMARY KEY CLUSTERED 
(
    [id] ASC 
) 

我也有以下CSV文件爲樣本,

PeriodStart,C1,C2,C3,C4,C5,C6,C7,C8 
2014-04-01T04:00:00.000Z,Kuber TEST,Another String Text Field,Quebec,Internal Server Name222,test service,TestingNowss,123178594823,12312 

我使用BCP導入此XML格式的文件:

<?xml version="1.0"?> 
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<RECORD> 
    <FIELD ID="1" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="24"/> 
    <FIELD ID="2" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="50"/> 
    <FIELD ID="3" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="50"/> 
    <FIELD ID="4" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="30"/> 
    <FIELD ID="5" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="40"/> 
    <FIELD ID="6" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="30"/> 
    <FIELD ID="7" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="50"/> 
    <FIELD ID="8" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="18"/> 
    <FIELD ID="9" xsi:type="CharTerm" TERMINATOR="\r\n" MAX_LENGTH="18"/> 
</RECORD> 
<ROW> 
    <COLUMN SOURCE="1" NAME="periodStartUTC" xsi:type="SQLDATETIMEOFFSET"/> 
    <COLUMN SOURCE="7" NAME="nbiApplicationType" xsi:type="SQLNVARCHAR"/> 
    <COLUMN SOURCE="2" NAME="applicationType" xsi:type="SQLNVARCHAR"/> 
    <COLUMN SOURCE="3" NAME="applicationProtocol" xsi:type="SQLNVARCHAR"/> 
    <COLUMN SOURCE="4" NAME="elementCluster" xsi:type="SQLNVARCHAR"/> 
    <COLUMN SOURCE="5" NAME="element" xsi:type="SQLNVARCHAR"/> 
    <COLUMN SOURCE="6" NAME="clientDevice" xsi:type="SQLNVARCHAR"/> 
    <COLUMN SOURCE="8" NAME="totalBytesDown" xsi:type="SQLBIGINT"/> 
    <COLUMN SOURCE="9" NAME="totalBytesUp" xsi:type="SQLBIGINT"/> 
</ROW> 
</BCPFORMAT> 

我正在運行以下BCP命令:

bcp SERVER_NAME.dbo.customDataFromAPI in C:\test_dataFile.csv -t, -f C:\test_format.xml -S SERVER_NAME -T -F2 

我試圖使用SSIS,它工作的很好,但是它非常慢,因爲我有大約2億個這樣的行來處理。作爲另一種選擇,我想了解並放置bcp進行測試,但到目前爲止甚至無法導入單行數據。有時候我也遇到臭名昭着的BCP的EOF錯誤,不知道發生了什麼。

回答

0

好的,發生這種情況是因爲bcp實際上是嘗試將第一列(sqldatetimeoffset)插入標識列,因爲它在使用XML格式文件時不會跳過它。該文件說:

隨着XML格式的文件,你不能跳過一列,當你 使用BCP命令或BULK INSERT 直接聲明導入到表中。

的解決方法是使用「舊式」格式文件,讓你定義列跳過,或者通過視圖進行插入:

CREATE VIEW SkipCol AS 
SELECT periodStartUTC, M1, M2, M3, M4, M5, M6, M7, M8 FROM customDataFromAPI; 

,然後BCP成:

bcp SERVER_NAME..SkipCol in C:\test_dataFile.csv -t, -f C:\test_format.xml -S SERVER_NAME -T -F2 
+0

使用視圖的好建議。不幸的是,我仍然得到'鑄造規格的無效字符值'錯誤。 – kbs7 2014-09-26 15:19:56

+0

@ kbs7這很奇怪,因爲它爲我工作。如果你添加'-e error_log.txt',你會得到一個帶有錯誤信息的日誌文件,它可能更有用(它應該指出錯誤的確切列)。 – jpw 2014-09-26 15:23:25

+0

好吧,所以這是第一個datetimeoffset列有數據的格式爲'2014-04-01T04:00:00.000Z'的錯誤。我試圖刪除'Z',並放置一個空格而不是'T',它工作。儘管當我直接插入SQL中的格式時,它可以工作! – kbs7 2014-09-26 15:31:40