2017-10-09 185 views
0

我使用BULK INSERT在procStock,並得到該錯誤消息:SQL服務器:BULK INSERT失敗IID_IColumnsInfo

消息4866,級別16,狀態8,2號線
的大容量加載失敗。數據文件中第1行第1列的列太長。驗證字段終止符和行終止符是否正確指定。

消息7301,級別16,狀態2,2號線
無法從OLE DB提供程序 「BULK」 鏈接服務器 「(空)」 所需的接口( 「IID_IColumnsInfo」)。

我在Stack尋找帖子,找到一些解決方案建議使用ROWTERMINATOR ='0x0a',但我仍然得到了同樣的錯誤。

SET @sir_de_executat = ' 
    BULK INSERT #test 
    FROM ''d:\scripts\test.csv'' 
    WITH (
     FIRSTROW=2 
     , FORMATFILE=''d:\scripts\aaa2.fmt'' 
     , FIELDTERMINATOR = '';'' 
     , ROWTERMINATOR = ''0x0a'' 
    )' 

感謝您的幫助。

下面是一個CSV樣本

BPARTNER;ME_TITLE_0208;BP_LSTNAME_0209;BP_FSTNAME_0210;STR_SUPPL1_0211;STR_SUPPL2_0212;HOUSE_NUM1_0213;HOUSE_NUM2_0214;STREET60_0215;STR_SUPPL4_0216;POSTALCODE_0217;CITY_1_0218;TEL_NUMBER_0219;FAX_NUMBER_0220;ZCHASSNR;ZFAHRZEUG__ZBRAND;ZFAHRZEUG__ZMODELKEY;ZFAHRZEUG__ZFISCHP;ZFAHRZEUG__ZMOTRVAR;ZFAHRZEUG__ZZULASSG;ZCREGDAT;/BIC/ZDDEALER;/BIC/Z_REGRNO_0124;ZFAHRZEUG__ZMOTR_KB4;ZFAHRZEUG__ZMODJAHR 
6016562635;0002;FOO;BAR;;;823;;RUE DE LA SOUTE;;60400;CUTS;;;AZEZZZ8U0HR067422;AU;8UGBGY;0008;D;20170803;20170803;FRAA01612;EP-803-RP;DFTA;2017 

這裏是FMT格式文件

10.0 
25 
1  SQLCHAR    0  20  "\t"  1  bpartner            SQL_Latin1_General_CP1_CI_AS 
2  SQLCHAR    0  30  "\t"  2  title             SQL_Latin1_General_CP1_CI_AS 
3  SQLCHAR    0  256  "\t"  3  last_name            SQL_Latin1_General_CP1_CI_AS 
4  SQLCHAR    0  256  "\t"  4  first_name            SQL_Latin1_General_CP1_CI_AS 
5  SQLCHAR    0  256  "\t"  5  street2            SQL_Latin1_General_CP1_CI_AS 
6  SQLCHAR    0  256  "\t"  6  street3            SQL_Latin1_General_CP1_CI_AS 
7  SQLCHAR    0  60  "\t"  7  house_number           SQL_Latin1_General_CP1_CI_AS 
8  SQLCHAR    0  60  "\t"  8  house_number_completion        SQL_Latin1_General_CP1_CI_AS 
9  SQLCHAR    0  256  "\t"  9  street             SQL_Latin1_General_CP1_CI_AS 
10  SQLCHAR    0  256  "\t"  10 street5            SQL_Latin1_General_CP1_CI_AS 
11  SQLCHAR    0  30  "\t"  11 postal_code           SQL_Latin1_General_CP1_CI_AS 
12  SQLCHAR    0  256  "\t"  12 city             SQL_Latin1_General_CP1_CI_AS 
13  SQLCHAR    0  128  "\t"  13 tel_number            SQL_Latin1_General_CP1_CI_AS 
14  SQLCHAR    0  128  "\t"  14 fax_number            SQL_Latin1_General_CP1_CI_AS 
15  SQLCHAR    0  50  "\t"  15 chassis_number           SQL_Latin1_General_CP1_CI_AS 
16  SQLCHAR    0  10  "\t"  16 brand             SQL_Latin1_General_CP1_CI_AS 
17  SQLCHAR    0  15  "\t"  17 model_key            SQL_Latin1_General_CP1_CI_AS 
18  SQLCHAR    0  15  "\t"  18 fiscal_horse_power          SQL_Latin1_General_CP1_CI_AS 
19  SQLCHAR    0  60  "\t"  19 engine_option           SQL_Latin1_General_CP1_CI_AS 
20  SQLCHAR    0  24  "\t"  20 first_registration_date        "" 
21  SQLCHAR    0  24  "\t"  21 current_registration_date        "" 
22  SQLCHAR    0  100  "\t"  22 sales_dealer           SQL_Latin1_General_CP1_CI_AS 
23  SQLCHAR    0  100  "\t"  23 licence_plate           SQL_Latin1_General_CP1_CI_AS 
24  SQLCHAR    0  60  "\t"  24 engine_code           SQL_Latin1_General_CP1_CI_AS 
25  SQLCHAR    0  12  "\r\n" 25 year             "" 
+0

你可以添加源文件中的示例行嗎? –

+0

爲什麼你使用'0x0a'而不是默認的'\ n'?你有沒有遇到*不同的錯誤,並認爲終結者錯了?或者SQL Server無法識別特殊字符? (即使它是,'0x0a'只是一個4字符的序列,而不是'\ n'字符 –

+0

試着先寫一個正確的BULK INSERT語句。*然後*嘗試找到一種方法來轉換它爲一個字符串。順便說一句,*爲什麼*使用在所有的字符串?爲什麼不直接調用BULK INSERT,傳遞了需要改變的參數的任何值? –

回答

0

當you'are創建FMT文件,你必須指定字段終止符是一樣的使用在您的CSV文件中。 文件,給出了bcp command,你必須指定-t選項

bcp AdventureWorks..myDepartment in C:\myDepartment-c-t.txt -c -t ; -r \n -T 

this documentation解釋,缺省的字段終結是\t,這似乎是這個問題。

+0

bcp鏈接無效。指定'\ r \ N'作爲行終止由'-r \ r'(見[指定字段和行終止符(SQL Server)的(https://docs.microsoft.com/en-us/sql/relational完成-databases/import-export/specify-field-and-row-terminators-sql-server) - 作爲終結者支持的字符)。 –

+0

Thx爲修正,我已經修復了這個鏈接,並且我已經修復了選項'-r \ n'因爲您是對的,Row Terminator自動添加了前綴'\ r' – Arno