我正在尝试将一些数据从 csv 文档插入到表中,该文档的所有字段都用“”分隔
即。
APPLICANTID,NAME,CONTACT,PHONENO,MOBILENO,FAXNO,EMAIL,ADDR1,ADDR2,ADDR3,STATE,POSTCODE
"3","Snoop Dogg","Snoop Dogg","411","","","","411 High Street","USA
","","USA", "1111" "4","LL Cool J","LL Cool J","","","","","5 King
Street","","","USA","1111"
我正在使用 xml 格式文件来尝试克服“”分隔符,因为我相信如果没有,我将在导入后再次更新数据以删除初始的“。
我的格式文件如下所示:
<?xml version="1.0"?>
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<RECORD>
<FIELD ID="1" xsi:type="NCharTerm" TERMINATOR='",' MAX_LENGTH="12"/>
<FIELD ID="2" xsi:type="CharTerm" TERMINATOR=',"' COLLATION="Latin1_General_CI_AS"/>
<FIELD ID="3" xsi:type="CharTerm" TERMINATOR=',"' COLLATION="Latin1_General_CI_AS"/>
<FIELD ID="4" xsi:type="CharTerm" TERMINATOR=',"' COLLATION="Latin1_General_CI_AS"/>
<FIELD ID="5" xsi:type="CharTerm" TERMINATOR=',"' COLLATION="Latin1_General_CI_AS"/>
<FIELD ID="6" xsi:type="CharTerm" TERMINATOR=',"' COLLATION="Latin1_General_CI_AS"/>
<FIELD ID="7" xsi:type="CharTerm" TERMINATOR=',"' COLLATION="Latin1_General_CI_AS"/>
<FIELD ID="8" xsi:type="CharTerm" TERMINATOR=',"' COLLATION="Latin1_General_CI_AS"/>
<FIELD ID="9" xsi:type="CharTerm" TERMINATOR=',"' COLLATION="Latin1_General_CI_AS"/>
<FIELD ID="10" xsi:type="CharTerm" TERMINATOR=',"' COLLATION="Latin1_General_CI_AS"/>
<FIELD ID="11" xsi:type="CharTerm" TERMINATOR=',"' COLLATION="Latin1_General_CI_AS"/>
<FIELD ID="12" xsi:type="CharTerm" TERMINATOR="\r\n" COLLATION="Latin1_General_CI_AS"/>
</RECORD>
<ROW>
<COLUMN SOURCE="1" NAME="APPLICANTID" xsi:type="SQLINT"/>
<COLUMN SOURCE="2" NAME="NAME" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="3" NAME="CONTACT" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="4" NAME="PHONENO" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="5" NAME="MOBILENO" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="6" NAME="FAXNO" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="7" NAME="EMAIL" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="8" NAME="ADDR1" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="9" NAME="ADDR2" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="10" NAME="ADDR3" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="11" NAME="STATE" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="12" NAME="POSTCODE" xsi:type="SQLCHAR"/>
</ROW>
</BCPFORMAT>
我正在使用以下命令运行导入:
BULK INSERT [PracticalDB].dbo.applicant
FROM 'C:\temp.csv'
WITH (KEEPIDENTITY, FORMATFILE='C:\temp.xml', FIRSTROW = 2)
我收到错误:
消息 4864,级别 16,状态 1,第 1 行批量加载数据转换错误 (指定代码页的类型不匹配或无效字符) 第 2 行第 1 列(申请人 ID)。
对于所有行。
我尝试了终结者的各种不同组合,包括使用:
TERMINATOR="","
TERMINATOR="\","
TERMINATOR='","
TERMINATOR='\","
而且它们似乎都不起作用。
是否有正确的方法来转义“,以便正确解析它,假设这是我的问题。
好吧,我明白了!
定义 xml 属性时,可以使用 ' 代替 ",即 TERMINATOR='',然后就可以在其中使用 ",而无需担心。
我还需要用字段吃掉第一个“,以便可以正确解析其他列。这最终得到了格式文件
<?xml version="1.0"?>
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<RECORD>
<FIELD ID="1" xsi:type="CharTerm" TERMINATOR='"' />
<FIELD ID="2" xsi:type="CharTerm" TERMINATOR='","' />
<FIELD ID="3" xsi:type="CharTerm" TERMINATOR='","' />
<FIELD ID="4" xsi:type="CharTerm" TERMINATOR='","' />
<FIELD ID="5" xsi:type="CharTerm" TERMINATOR='","' />
<FIELD ID="6" xsi:type="CharTerm" TERMINATOR='","' />
<FIELD ID="7" xsi:type="CharTerm" TERMINATOR='","' />
<FIELD ID="8" xsi:type="CharTerm" TERMINATOR='","' />
<FIELD ID="9" xsi:type="CharTerm" TERMINATOR='","' />
<FIELD ID="10" xsi:type="CharTerm" TERMINATOR='","' />
<FIELD ID="11" xsi:type="CharTerm" TERMINATOR='","' />
<FIELD ID="12" xsi:type="CharTerm" TERMINATOR='","' />
<FIELD ID="13" xsi:type="CharTerm" TERMINATOR='"\r\n' />
</RECORD>
<ROW>
<COLUMN SOURCE="2" NAME="APPLICANTID" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="3" NAME="NAME" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="4" NAME="CONTACT" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="5" NAME="PHONENO" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="6" NAME="MOBILENO" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="7" NAME="FAXNO" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="8" NAME="EMAIL" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="9" NAME="ADDR1" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="10" NAME="ADDR2" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="11" NAME="ADDR3" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="12" NAME="STATE" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="13" NAME="POSTCODE" xsi:type="SQLCHAR"/>
</ROW>
</BCPFORMAT>
第一个字段只是一个一次性字段,用于删除第一个“,其他字段全部在“,”上分隔,最后一个字段在“(换行符)上分隔”
提示:如果只有部分字段被 doubleqouted,则使用
openrowset
版本的批量插入,这样做,您可以操作来自输入文件的字段内容
在插入目标表之前。
在操作中,您可以对字段内容执行任何操作,例如删除双引号。这里不提对性能的影响,对此我没有措施。
提示:如果您的 CSV 文件没有一致的格式,例如在同一列上,某些值会被双重引用,而有些则不是,此博客将帮助您以简单的方式完成此操作(这是 Estevez 提示的继续,如下所示)使用 openrowset 只是最后一步) http://ariely.info/Blog/tabid/83/EntryId/122/Using-Bulk-Insert-to-import-inconsistency-data-format-using-pure-T-SQL.aspx
我对 Daniel Powell 提供的解决方案有疑问 - 除了数据文件的最后一行之外,它完美地加载了数据。数据文件的最后一行数据也有一个 CRLF,但我仍然在加载时遇到问题。还有其他人遇到过这个问题并解决了吗?谢谢