【问题标题】:Sql Bulk insert XML format file with double quotes in terminatorSql Bulk 在终止符中插入带有双引号的 XML 格式文件
【发布时间】:2011-12-16 05:55:02
【问题描述】:

我正在尝试从 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)

我收到错误:

Msg 4864, Level 16, State 1, Line 1 Bulk load 数据转换错误 (指定代码页的类型不匹配或无效字符) 第 2 行,第 1 列(APPLICANTID)。

所有行。

我尝试了各种不同的终结器组合,包括使用:

TERMINATOR="&quot;,"
TERMINATOR="\","
TERMINATOR='","
TERMINATOR='\","

它们似乎都不起作用。

假设这是我的问题,是否有正确的方法来转义 " 以便正确解析它。

【问题讨论】:

    标签: sql-server xml bulkinsert bcp


    【解决方案1】:

    好的,我想通了!

    你可以在定义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>
    

    第一个字段只是删除第一个“的丢弃字段,其他字段都在“,”上分开,最后一个在“(换行符)上分开

    【讨论】:

    • 谢谢!这是我发现的一个非常常见的问题的最佳解决方案。我为我的导入创建了一个类似的 xml 文件,它运行良好。
    【解决方案2】:

    提示:如果只有部分字段被双引号,则使用openrowset 版本的批量插入,这样做,您可以操作来自输入文件的字段内容 在插入目标表之前。

    在操作中,您可以对字段内容做任何事情,例如删除双引号。这里没有提到对性能的影响,我对此没有任何措施。

    【讨论】:

      【解决方案3】:

      提示:如果您的 CSV 文件没有一致的格式,例如在同一列上,有些值是双引号,有些不是这个博客将帮助您以一种简单的方式做到这一点(这是对 Estevez 的继续提示,因为使用 openrowset 只是最后一步) http://ariely.info/Blog/tabid/83/EntryId/122/Using-Bulk-Insert-to-import-inconsistent-data-format-using-pure-T-SQL.aspx

      【讨论】:

        猜你喜欢
        • 2012-07-15
        • 1970-01-01
        • 2015-02-28
        • 1970-01-01
        • 2019-02-15
        • 2013-03-24
        • 1970-01-01
        • 2023-03-25
        • 2013-01-17
        相关资源
        最近更新 更多