您极不可能在一个众所周知的、被广泛使用且有详尽记录的工具中发现错误。您更有可能没有找到正确的格式说明组合或犯了其他错误。
话虽如此,(对我来说)仍然不完全清楚你想要实现什么。我最好的理解是,您的文件有 3 个固定长度值,您的表有 3 列,并且您希望将文件中的 2 个值复制到表中的 2 列,这样您最终会在名称列中看到“Test”值栏中的 100?
这意味着您想要跳过文件中的最后一个值和表中的第一列。请注意这句话来自文档:
对于 XML 格式文件,您不能跳过某一列
使用 bcp 命令或 BULK 直接导入到表中
插入语句。但是,您可以导入除最后一列之外的所有列
一张桌子的。如果必须跳过除最后一列以外的任何列,则必须
创建仅包含列的目标表的视图
包含在数据文件中。然后,您可以从中批量导入数据
文件到视图中。
要使用 XML 格式文件跳过表列,请使用
OPENROWSET(BULK...),您必须提供显式的列列表
选择列表以及目标表中,如下所示:
插入...从OPENROWSET中选择(批量...)
基于所有这些背景,您可以创建一个视图并使用 bcp.exe,或者仅将 OPENROWSET() 与表一起使用,我认为这更容易:
桌子:
CREATE TABLE [dbo].metadata (
[myId] [smallint] IDENTITY(1,1) NOT NULL,
[name] [nchar](10) NOT NULL,
[value] [int] NOT NULL,
CONSTRAINT [PK_metadado] PRIMARY KEY CLUSTERED ([myId] ASC)
)
数据文件(以 Windows 换行符终止的行,即 CRLF,请参阅下面的示例 OFXML 格式文件示例):
Test 0010000290
格式文件:
<?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="CharFixed" LENGTH="10"/>
<FIELD ID="2" xsi:type="CharFixed" LENGTH="5"/>
<FIELD ID="3" xsi:type="CharTerm" TERMINATOR="\r\n"/>
</RECORD>
<ROW>
<COLUMN SOURCE="1" NAME="name" xsi:type="SQLNCHAR"/>
<COLUMN SOURCE="2" NAME="value" xsi:type="SQLINT"/>
</ROW>
</BCPFORMAT>
命令:
insert into dbo.metadata ([name], [value])
select [name], [value]
from openrowset(bulk 'C:\SomeFolder\data.bcp',
formatfile = 'C:\SomeFolder\format.xml'
) dt
最后,还有其他几个小点。请务必提及您正在使用的 SQL Server 版本:许多功能仅在特定版本中可用。您还应该检查您的列名称;我知道您可能只是将它们用作此处的快速示例,但它们的描述性并不强,并且 VALUE 是一个 ODBC保留关键字Microsoft 建议不要在 SQL Server 中使用。