我正在尝试通过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文件,使用上面的代码,数据就是这样的(但不在原始文件中:]
我该怎么办?
我不希望这样做,但是如果可以忽略这些记录,但是插入完成了,情况会更糟。
信息:
通常使用格式文件来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'
);