【问题标题】:bcp import error with xml format file and identity columnxml 格式文件和标识列的 bcp 导入错误
【发布时间】:2011-12-01 19:38:11
【问题描述】:

我在 SQL Server 中创建了一个表,例如:

CREATE TABLE [dbo].[    
    [myId] [smallint] IDENTITY(1,1) NOT NULL,
    [name] [nchar](10) NOT NULL,
    [value] [int] NOT NULL,
CONSTRAINT [PK_metadado] PRIMARY KEY CLUSTERED 
(
  [myId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]

我想使用 xml 格式化程序在我的表中导入一个文件。我遇到了问题,因为我的桌子上有“myId”。我认为这是 bcp 中的一个错误,因为如果我不添加 myId 列,则导入工作正常。

文件:

Test      0010000290

Xml 格式文件:

<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="CharFixed" LENGTH="5"/> 
</RECORD>
<ROW>
    <COLUMN SOURCE="3" NAME="value" xsi:type="SQLINT" />
    <COLUMN SOURCE="1" NAME="name" xsi:type="SQLCHAR" />
</ROW>
</BCPFORMAT>

输出:

Starting copy...
SQLState = 23000, NativeError = 515
Error = [Microsoft][SQL Server Native Client 10.0][SQL Server]Cannot insert the value NULL into column 'value', table 'XXX.dbo.metadata'; column does not allow nulls. INSERT fails.
SQLState = 01000, NativeError = 3621
Warning = [Microsoft][SQL Server Native Client 10.0][SQL Server]The statement has been      terminated.
BCP copy in failed

编辑

@马修马丁: “价值”在我的第一种格式中为空。 如果我使用 null

创建这种奇怪的 xml 格式,它会起作用
<COLUMN SOURCE="2" NAME="null" xsi:type="SQLCHAR" />
<COLUMN SOURCE="1" NAME="name" xsi:type="SQLCHAR" />
<COLUMN SOURCE="3" NAME="value" xsi:type="SQLINT" />    

【问题讨论】:

  • 您的问题不清楚:您遇到了什么“问题”?你有错误信息吗?而且我不明白“如果我不使用特殊的 int pk 列它可以正常工作”是什么意思?您需要准确地向我们展示哪些有效,哪些无效。
  • 使列可以为空,看看它是如何运行的。我希望特定行为空,或全部为空。无论哪种方式,它都会指向解决方案(1 rouge 行或 bcp 语法仍然不正确)
  • 我认为这是 bcp 中的错误。 ://

标签: sql-server bcp


【解决方案1】:

您极不可能在知名、使用广泛且文档详尽的工具中发现错误。更有可能是您没有找到正确的格式说明组合或犯了其他错误。

话虽如此,但(对我而言)您想要实现的目标仍然不完全清楚。我最好的理解是你的文件有 3 个固定长度的值,你的表有 3 列,并且你想将文件中的 2 个值复制到表中的 2 列,这样你最终在 name 列中得到 'Test'和值列中的 100?

这意味着您要跳过文件中的最后一个值和表中的第一列。请注意来自the documentation 的这句话:

使用 XML 格式文件时,您不能跳过一列 使用 bcp 命令或 BULK 直接导入表 插入语句。但是,您可以导入除最后一列之外的所有内容 的一张桌子。如果您必须跳过除最后一列之外的任何内容,则必须 创建仅包含列的目标表的视图 包含在数据文件中。然后,您可以从中批量导入数据 文件到视图中。

使用 XML 格式文件跳过表格列,方法是使用 OPENROWSET(BULK...),您必须提供明确的列列表 选择列表和目标表,如下:

插入...从开放式集合中选择(批量...)

基于所有这些背景,您可以创建一个视图并使用 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 换行符结束,即 CR+LF,参见 sample XML format files 下的示例 F):

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 是 Microsoft 建议不要在 SQL Server 中使用的 ODBC reserved keyword

【讨论】:

  • 感谢您的回复! BCP 将简单的进口变成了一件很难做的事情。 ://
猜你喜欢
  • 1970-01-01
  • 2011-03-11
  • 2020-02-02
  • 2016-09-22
  • 1970-01-01
  • 2023-03-25
  • 2016-04-14
  • 2021-06-28
  • 1970-01-01
相关资源
最近更新 更多