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文件有错误,使用上面的代码,数据是这样的(但不是在原始文件中):
我该怎么办?
我不喜欢,但如果可以忽略这些记录但插入完成,那就更好了。
信息:
- SQL 服务器 2019 (v15.0.18330.0)
- SQL 服务器管理对象 (SMO) v16.100.37971.0
- Microsoft SQL Server Management Studio v18.5
使用格式文件 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'
);
我正在尝试通过 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文件有错误,使用上面的代码,数据是这样的(但不是在原始文件中):
我该怎么办?
我不喜欢,但如果可以忽略这些记录但插入完成,那就更好了。
信息:
- SQL 服务器 2019 (v15.0.18330.0)
- SQL 服务器管理对象 (SMO) v16.100.37971.0
- Microsoft SQL Server Management Studio v18.5
使用格式文件 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'
);