sql server大容量插入错误7301“iid\u icolumnsinfo”

3npbholx  于 2021-07-29  发布在  Java
关注(0)|答案(1)|浏览(410)

我试图通过一个csv文件进行插入,顺便说一句,它每天都会通过一个过程执行,但它给出了相同的错误。
消息7301,16级,状态2,第16行
无法从链接服务器(null)的ole db提供程序“bulk”获取所需的接口(“iid\u icolumnsinfo”)。
我要导入的表将所有字段 nvarchar 所有这些都至少有500个字符,因为我认为这就是问题所在。
我通过powershell导出的csv文件如下:

Export-Csv -Path $DirPath -Delimiter ';' -NoTypeInformation -Encoding UTF8

该文件有40列和685行,我已经尝试用“,”分隔符和“;”保存csv文件分隔符,但两者有相同的错误。
我尝试了以下几种方法来进行批量插入,但没有成功。

BULK INSERT DEV_DS_SANTOGRAU..GB_TBIMP_FOTOS_CSV
FROM 'C:\Users\userbi\Desktop\Projetos-Santo-Grau\Projeto1-RelatoriodeEstoque\TBIMP_FOTOS_CSV.csv'
WITH (FORMAT = 'CSV', 
      --MAXERRORS = 0,
      --CODEPAGE = '65001',
      CODEPAGE = 'ACP',
      --FIELDQUOTE = '"', 
      FIELDTERMINATOR ='";"', 
      --ROWTERMINATOR ='"\n"',
      ROWTERMINATOR = '\r\n',
      --ROWTERMINATOR = "0x0a"
      FIRSTROW = 2,
      ERRORFILE = 'C:\Users\userbi\Desktop\Projetos-Santo-Grau\Projeto1-RelatoriodeEstoque\TBIMP_FOTOS_CSV_ERROS.csv');

一旦他导出了一个有错误的csv和txt文件,使用上面的代码,数据是这样的(但不是在原始文件中):

我该怎么办?
我不喜欢,但如果可以忽略这些记录,但插入已完成,情况会更糟。
信息:
sql server 2019(v15.0.18330.0)
sql server管理对象(smo)v16.100.37971.0
microsoft sql server management studio v18.5

xienkqul

xienkqul1#

通常比较容易理解 BULK INSERT 具有格式文件的数据。使用bcp.exe实用程序通过以下命令创建格式文件:

bcp.exe DEV_DS_SANTOGRAU..GB_TBIMP_FOTOS_CSV format nul -c -t; -f C:\Temp\TBIMP_FOTOS_CSV.fmt -S(local) -T

哪里: DEV_DS_SANTOGRAU..GB_TBIMP_FOTOS_CSV 是与我们交互的database.schema.table。 format 指定格式文件创建模式。 nul 指定输入/输出数据文件,在本例中表示“不写入任何数据”。 -c 指定字符模式,而不是本机(二进制)模式。 -t; 指定要使用的 ; 作为字段分隔符字符。 -f C:\Temp\TBIMP_FOTOS_CSV.fmt 指定要将格式文件写入的路径(相对于本地计算机)。 -S(local) 是要连接到的sql server, (local) 就我而言。 -T 表示可信身份验证(windows身份验证),使用 -uUsername 以及 -pPassword 如果您使用sql登录身份验证。
这将创建一个如下所示的格式文件(您的文件将有更多不同的列):

14.0
2
1       SQLCHAR             0       510     ";"      1     Filename                 SQL_Latin1_General_Pref_CP1_CI_AS
2       SQLCHAR             0       510     "\r\n"   2     Resolution               SQL_Latin1_General_Pref_CP1_CI_AS

现在,在ssms中,您应该能够运行以下操作来导入数据文件(根据需要调整相对于sql server的文件路径):

BULK INSERT DEV_DS_SANTOGRAU..GB_TBIMP_FOTOS_CSV
FROM 'C:\Temp\TBIMP_FOTOS_CSV.csv'
WITH (
    CODEPAGE = '65001',
    DATAFILETYPE = 'char',
    FORMAT = 'CSV', 
    FORMATFILE = 'C:\Temp\TBIMP_FOTOS_CSV.fmt'
);

--编辑--
对sql server和国际字符的支持。
sql server和utf-8有一段曲折的历史,仅在sql server 2016中获得部分支持,在sql server 2019中真正只支持utf-8代码页。导入和导出带有国际字符的文件最好还是使用utf-16编码文件。工作流的调整如下。。。
在powershell中,使用 Unicode 编码而不是 UTF8 :

Export-Csv -Path $DirPath -Delimiter ';' -NoTypeInformation -Encoding Unicode

生成bcp格式文件时,请使用 -w 开关(用于widechar)而不是 -c (对于char):

bcp.exe DEV_DS_SANTOGRAU..GB_TBIMP_FOTOS_CSV format nul -w -t; -f C:\Temp\TBIMP_FOTOS_CSV-widechar.fmt -S(local) -T

这会导致 SQLCHAR 列写出为 SQLNCHAR ,又名。国民性支持:

14.0
2
1       SQLNCHAR            0       510     ";\0"        1     Filename                 SQL_Latin1_General_Pref_CP1_CI_AS
2       SQLNCHAR            0       510     "\r\0\n\0"   2     Resolution               SQL_Latin1_General_Pref_CP1_CI_AS

使用时 BULK INSERT 指定 DATAFILETYPE = 'widechar' 而不是 DATAFILETYPE = 'char' 以及指定代码页,例如:

BULK INSERT GB_TBIMP_FOTOS_CSV
FROM 'C:\Temp\TBIMP_FOTOS_CSV.csv'
WITH (
    DATAFILETYPE = 'widechar',
    FORMATFILE = 'C:\Temp\TBIMP_FOTOS_CSV-widechar.fmt'
);

相关问题