【问题标题】:Why does Format File cause error during SQL Server Bulk Insert?为什么在 SQL Server 批量插入期间格式化文件会导致错误?
【发布时间】:2019-06-19 18:44:20
【问题描述】:

我正在尝试使用 XML 格式文件将 CSV 文件批量插入 SQL Server 2017:

<?xml version="1.0"?>
<BCPFORMAT xmlns="https://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <RECORD>
        <FIELD ID="Col_0" xsi:type="CharTerm" MAX_LENGTH="100" TERMINATOR=","/>
        <FIELD ID="Col_1" xsi:type="CharTerm" MAX_LENGTH="100" TERMINATOR=","/>
        <FIELD ID="Col_2" xsi:type="CharTerm" MAX_LENGTH="3" TERMINATOR=","/>
        <FIELD ID="Col_3" xsi:type="CharFixed" Length="19" TERMINATOR=","/>
        <FIELD ID="Col_4" xsi:type="CharFixed" Length="19" TERMINATOR=","/>
        <FIELD ID="Col_5" xsi:type="CharFixed" Length="53" TERMINATOR=","/>
        <FIELD ID="Col_6" xsi:type="CharFixed" Length="10" TERMINATOR=","/>
    </RECORD>
    <ROW>
        <COLUMN SOURCE="Col_0" NAME="NAME" xsi:type="SQLVARCHAR"/>
        <COLUMN SOURCE="Col_1" NAME="MATCHNAME" xsi:type="SQLVARCHAR"/>
        <COLUMN SOURCE="Col_2" NAME="CHROMOSOME" xsi:type="SQLVARCHAR"/>
        <COLUMN SOURCE="Col_3" NAME="START_LOCATION" xsi:type="SQLBIGINT"/>
        <COLUMN SOURCE="Col_4" NAME="END_LOCATION" xsi:type="SQLBIGINT"/>
        <COLUMN SOURCE="Col_5" NAME="CENTIMORGANS" xsi:type="SQLFLT4"/>
        <COLUMN SOURCE="Col_6" NAME="MATCHING_SNPS" xsi:type="SQLSMALLINT"/>
    </ROW>
</BCPFORMAT>

执行此操作时,我收到以下错误消息:

执行期间出错 37000(4855)[Microsoft][ODBC SQL Server Driver][SQL Server]格式文件“c:\temp\FormatFile.xml”中的第 2 行:意外元素“BCPFORMAT”。

我不明白为什么无法识别 BCPFORMAT 元素。 XML 根据 Altova XMYSpy 正确格式化。

执行上传的代码是:

bulk insert FF_ChromBrwResults_20190124 from 'c:\temp\temp.csv'
 with (FIELDTERMINATOR = ',',FIRSTROW =1,ROWTERMINATOR = '\n'
,KEEPIDENTITY,CODEPAGE ='OEM',KEEPNULLS, FORMATFILE = 'c:\temp\FormatFile.xml' ) 

CSV 有很多行采用这种格式,以换行符结尾:

姓名1,姓名2, 1,48745397,54260005,2.84,1000

我尝试从 .NET 代码和 ODBC 连接工作的 AQT 中执行此操作;两种方法都产生相同的错误。

【问题讨论】:

    标签: sql-server bulkinsert


    【解决方案1】:

    不是一个完整的答案,因为我发现格式文件是一个经久不衰的谜,但尝试让 BCP 生成格式文件,例如:

    bcp tempdb.dbo.FF_ChromBrwResults_20190124 format nul -c -x -t "," -f formatfile_gen.xml  -T -S localhost
    

    这张桌子的哪个

    create table FF_ChromBrwResults_20190124
    (
      NAME varchar(100),
      MATCHNAME varchar(100),
      CHROMOSOME varchar(30),
      START_LOCATION bigint,
      END_LOCATION bigint,
      CENTIMORGANS real,
      MATCHING_SNPS smallint
    )
    

    输出

    <?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="," MAX_LENGTH="100" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
      <FIELD ID="2" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="100" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
      <FIELD ID="3" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="30" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
      <FIELD ID="4" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="21"/>
      <FIELD ID="5" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="21"/>
      <FIELD ID="6" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="30"/>
      <FIELD ID="7" xsi:type="CharTerm" TERMINATOR="\r\n" MAX_LENGTH="7"/>
     </RECORD>
     <ROW>
      <COLUMN SOURCE="1" NAME="NAME" xsi:type="SQLVARYCHAR"/>
      <COLUMN SOURCE="2" NAME="MATCHNAME" xsi:type="SQLVARYCHAR"/>
      <COLUMN SOURCE="3" NAME="CHROMOSOME" xsi:type="SQLVARYCHAR"/>
      <COLUMN SOURCE="4" NAME="START_LOCATION" xsi:type="SQLBIGINT"/>
      <COLUMN SOURCE="5" NAME="END_LOCATION" xsi:type="SQLBIGINT"/>
      <COLUMN SOURCE="6" NAME="CENTIMORGANS" xsi:type="SQLFLT4"/>
      <COLUMN SOURCE="7" NAME="MATCHING_SNPS" xsi:type="SQLSMALLINT"/>
     </ROW>
    </BCPFORMAT>
    

    【讨论】:

    • 谢谢。我仍然收到相同的错误,但略有不同:执行期间出错 37000(102)[Microsoft][ODBC SQL Server Driver][SQL Server]'.' 附近的语法不正确。 37000(8180)[Microsoft][ODBC SQL Server Driver][SQL Server]Statement(s) 无法准备。我想知道 bcp 是否需要与查询不同的 ODBC?
    【解决方案2】:

    出现此错误是因为 xmlns 的 url 包含 HTTPS 正确的是 HTTP。

    不正确 = &lt;BCPFORMAT xmlns="https://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&gt;

    正确 = &lt;BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&gt;

    一旦 CharFixed 的分隔符不是逗号而是长度属性,您的 XML 文件还需要一次修改将所有 CharFixed 转换为 CharTerm。

    将所有类型的 SQLVARCHAR 更改为 SQLVARYCHAR

    <?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="Col_0" xsi:type="CharTerm" MAX_LENGTH="100" TERMINATOR=","/>
            <FIELD ID="Col_1" xsi:type="CharTerm" MAX_LENGTH="100" TERMINATOR=","/>
            <FIELD ID="Col_2" xsi:type="CharTerm" MAX_LENGTH="3" TERMINATOR=","/>
            <FIELD ID="Col_3" xsi:type="CharTerm" TERMINATOR=","/>
            <FIELD ID="Col_4" xsi:type="CharTerm" TERMINATOR=","/>
            <FIELD ID="Col_5" xsi:type="CharTerm" TERMINATOR=","/>
            <FIELD ID="Col_6" xsi:type="CharTerm" TERMINATOR=","/>
        </RECORD>
        <ROW>
            <COLUMN SOURCE="Col_0" NAME="NAME" xsi:type="SQLVARYCHAR"/>
            <COLUMN SOURCE="Col_1" NAME="MATCHNAME" xsi:type="SQLVARYCHAR"/>
            <COLUMN SOURCE="Col_2" NAME="CHROMOSOME" xsi:type="SQLVARYCHAR"/>
            <COLUMN SOURCE="Col_3" NAME="START_LOCATION" xsi:type="SQLBIGINT"/>
            <COLUMN SOURCE="Col_4" NAME="END_LOCATION" xsi:type="SQLBIGINT"/>
            <COLUMN SOURCE="Col_5" NAME="CENTIMORGANS" xsi:type="SQLFLT4"/>
            <COLUMN SOURCE="Col_6" NAME="MATCHING_SNPS" xsi:type="SQLSMALLINT"/>
        </ROW>
    </BCPFORMAT> 
    

    【讨论】:

    • 谢谢。我应用了这些更正。但是,正如我在上面的评论中提到的,我仍然遇到错误。这可能是连接问题 (ODBC)。但这在其他查询运行时很特殊
    • 好的。可能有几个问题在解决后解决了这个问题:1)Davd 和 Fernando 都提到的那些; 2) 我没有安装 bcp 实用程序,3) 我的命令需要指定数据库并使用 dbo。有了这些变化,一切都开始了……非常感谢您的帮助!
    • 我已经为此苦苦挣扎了几个小时,并且有几个问题,但所有 MS Docs 都显示使用“https”,而没有提到“http”。谢谢,这帮助很大。
    • 感谢您的帮助,这解决了我的问题 :) 似乎有很多模板不起作用
    猜你喜欢
    • 2017-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2021-06-28
    • 1970-01-01
    • 2012-11-29
    相关资源
    最近更新 更多