SQL 服务器批量插入错误 7301 "IID_IColumnsInfo"

SQL Server Bulk Insert Error 7301 "IID_IColumnsInfo"

我正在尝试通过 CSV 文件插入,顺便说一句,它每天都会通过一个过程执行,但它给出了同样的错误。

Msg 7301, Level 16, State 2, Line 16
Cannot obtain the required interface ("IID_IColumnsInfo") from OLE DB provider "BULK" for linked server "(null)".

我正在尝试导入的 table 我将所有字段都设为 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文件有错误,使用上面的代码,数据是这样的(但不是在原始文件中):

我该怎么办?

我不喜欢,但如果可以忽略这些记录但插入完成,那就更好了。

信息:

使用格式文件 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 指定 input/output 数据文件,在本例中表示 "don't write any data".
  • -c 指定字符模式,与本机(二进制)模式相对。
  • -t;指定使用;作为字段分隔符。
  • -f C:\Temp\TBIMP_FOTOS_CSV.fmt 指定写入格式文件的路径,相对于您的本地计算机。
  • -S(local) 是要连接的 SQL 服务器,在我的例子中是 (local)
  • -T 表示受信任的身份验证(Windows 身份验证),如果您有 SQL 登录身份验证,请使用 -uUsername-pPassword

这会创建一个类似于以下内容的格式文件(您的会有更多不同的列):

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 服务器的文件路径):

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 服务器和国际字符支持。

SQL Server 和 UTF-8 的历史有点曲折,只有 SQL Server 2016 才获得部分支持,实际上只支持 [=86= 的 UTF-8 代码页] Server 2019。导入和导出具有国际字符的文件仍然最好使用 UTF-16 编码文件处理。工作流程调整如下...

在 PowerShell 中,使用 Unicode 编码代替 UTF8:

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

生成 BCP 格式文件时,使用 -w 开关(对于宽字符)而不是 -c(对于字符):

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     ";[=15=]"        1     Filename                 SQL_Latin1_General_Pref_CP1_CI_AS
2       SQLNCHAR            0       510     "\r[=15=]\n[=15=]"   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'
);