2017-10-09 182 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