sql-server - 为什么在 SQL Server 批量插入期间格式化文件会导致错误?

标签 sql-server bulkinsert

我正在尝试使用 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>

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

Error during Execute 37000(4855)[Microsoft][ODBC SQL Server Driver][SQL Server]Line 2 in format file "c:\temp\FormatFile.xml": unexpected element "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 有许多这种格式的行,以换行符结尾:

Name1,Name2, 1,48745397,54260005,2.84,1000



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

最佳答案

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

不正确 = <BCPFORMAT xmlns="https://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
正确 = <BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
一旦 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> 

关于sql-server - 为什么在 SQL Server 批量插入期间格式化文件会导致错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54373618/

相关文章:

c# - 如何检查 ID 在 ASP MVC 和 EF 中是否不重复

sql-server - 创建 MSSQL 存储过程以检查 TableA 记录计数。然后将 TableA 记录插入到 TableB

sql-server - 从 PowerShell 访问 SQL Server 时出现问题

node.js - 使用 mongoose 在 MongoDB 中批量插入多个集合

php - mysql INSERT查询中的动态php变量

python - 批量插入到 MongoDB 中的 GridFS

c# - 存在数据时添加 ID 列的简便方法

sql - 在将记录添加到数据库之前检查记录是否存在

django - 在批量 python 中创建资源时如何跳过现有对象实例

javascript - 使用准备好的语句插入多行