我试图通过一个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
1条答案
按热度按时间xienkqul1#
通常比较容易理解
BULK INSERT
具有格式文件的数据。使用bcp.exe实用程序通过以下命令创建格式文件:哪里:
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登录身份验证。这将创建一个如下所示的格式文件(您的文件将有更多不同的列):
现在,在ssms中,您应该能够运行以下操作来导入数据文件(根据需要调整相对于sql server的文件路径):
--编辑--
对sql server和国际字符的支持。
sql server和utf-8有一段曲折的历史,仅在sql server 2016中获得部分支持,在sql server 2019中真正只支持utf-8代码页。导入和导出带有国际字符的文件最好还是使用utf-16编码文件。工作流的调整如下。。。
在powershell中,使用
Unicode
编码而不是UTF8
:生成bcp格式文件时,请使用
-w
开关(用于widechar)而不是-c
(对于char):这会导致
SQLCHAR
列写出为SQLNCHAR
,又名。国民性支持:使用时
BULK INSERT
指定DATAFILETYPE = 'widechar'
而不是DATAFILETYPE = 'char'
以及指定代码页,例如: