SQL Server批量插入错误7301“ IID_IColumnsInfo”

问题描述 投票:0回答:1

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

消息7301,第16级,状态2,第16行 无法从OLE DB访问接口“ BULK”获得链接服务器“(空)”的所需接口(“ IID_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文件,使用上面的代码,数据就是这样的(但不在原始文件中:]

enter image description here

我该怎么办?

我不希望这样做,但是如果可以忽略这些记录,但是插入完成了,情况会更糟。

信息:

  • SQL Server 2019(v15.0.18330.0)
  • SQL Server管理对象(SMO)v16.100.37971.0
  • Microsoft SQL Server Management Studio v18.5
sql sql-server tsql bulkinsert
1个回答
2
投票

通常使用格式文件来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身份验证),如果您具有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 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'
);
© www.soinside.com 2019 - 2024. All rights reserved.