2009-05-22 59 views
2

我很困惑SQL Server 2005如何支持导入和导出XML文件。我在想BCP是要走的路。然而,在阅读所有文档后,似乎没有办法只取一张常规表格并以XML格式导出。我问的原因是我正在与一个客户端合作,他将以XML格式向我发送数据更新。我们都有相同结构的相同数据库。他向我发送了示例XML文件。我假设会有一些非常简单的方法来导入数据文件,但我无法弄清楚。任何人都可以帮助我理解如何获取XML文件并将数据导入到现有表中?它应该很简单,因为XML文件是从具有完全相同结构的表生成的。如何将数据从SQL Server 2005导入和导出为XML格式?

感谢, 科瑞

回答

0

我假设客户端使用FOR XML包装关系数据作为XML文件?没有automagic方法将xml分解回原始的关系结构,但是如果原始的xml代也使用XMLSCHEMA指令,您应该能够以编程方式进行编程。如果客户端包含这个,则将生成一个xml模式,该模式描述在xml实例中的哪个列(及其类型)被表示。我开始使用这种方法,但从来没有完成过。

+0

我不确定客户端如何创建XML文件。我正在与他联系并试图了解他是如何创建XML文件的。我的猜测是他手工创建了它们,我将不得不编写某种解析算法,手工一次一行地输入数据。我希望它会更自动 - 有点像备份和恢复,但也许这不可能使用XML。 – 2009-05-22 17:22:34

2

为什么地球上首先使用XML作为交换格式?

如果您在两侧都有完全相同的数据模型,纯文本文件或BCP文件将完全适合您的需求,并且体积更小(即提取和加载速度更快)!

仅仅因为XML是“最先进的”,它总是最好的选择!当然,如果您相信您将来有一段时间需要与第三方交换数据,而第三方不共享相同的数据模型甚至是相同的平台或界面,但情况当然不同。

1

的SQL Server 2005允许将XML数据存储在两个方面: - 作为一个行集& - 行集中

  • XML列

    存储XML数据如果您的客户端发送你的数据作为一个 的XML文档,你需要将 这个数据存储在一个数据库表中,第一个 需要“分解”这个XML数据。 SQL 服务器允许您通过使用其相关存储过程的OPENXML函数和 来碎化XML数据 。

粉碎XML文档涉及以下任务:

  • 我)解析XML文档SQL Server 2005提供了 sp_xml_preparedocument存储过程来解析XML文档。 此存储过程读取xml 文档并使用MSXML 解析器解析它。解析的文档是 xml文档中的各种节点的内部树表示,例如 元素,属性,文本和 评论。
  • ii)从树中检索行集。 现在您需要从 中提取可用的xml数据。您使用 openxml函数为此目的并从解析的数据生成内存中的行集 。语法: openxml(idoc int[in],rowpattern nvarchar[in],[flags byte[in]]) [WITH (SchemaDeclaration | TableName)]
    idoc-指定XML文档 rowpattern-的 内部树表示的文档句柄指定用来识别被处理为行 节点中的XPath 图案。 flags- 表示应的XML数据和关系 行集之间 使用的映射,以及如何溢出柱 应该被填充。它是可选的,并且 可以具有0,1,2,3以使用默认的 映射来检索属性 值,以检索元素值 并且分别检索两个值 。 SchemaDeclaration- 指定通过使用 列名称,数据类型和 模式的组合返回的列的行声明 为 。 TableName-规定可以给予SchemaDeclaration代替 的 表名,如果需要与 所需要的模式已经存在,并且没有 模式的表。
  • iii)存储行集中的数据。 您可以使用由 openxml创建的行集来存储数据,这与您将起诉任何其他 行集的方式相同。您可以将行集 数据插入 数据库中的永久表中。
  • ⅳ)清除存储器。你需要 释放内存中你存储的行集合 。为此,您使用存储过程的 sp_xml_removedocument

例如,下面是一个XML文档提供的数据:

DECLARE @Doc int 
    DECLARE @XMlDoc nvarchar(1000) 
    SET @XMLDoc = N'<ROOT> 
    <Customer CustomerID="JHO1" Name="Jack"> 
     <Order OrderID="1001" CustomerID="JH01" 
      OrderDate="2009-07-04T00:00:00"> 
     <OrderDetail ProductID="11" Quantity="12"/> 
     <OrderDetail ProductID="22" Quantity="10"/> 
    </Order> 
    </Customer> 
<Customer CustomerID="SG01" Name="Steve"> 
    <Order OrderID="1002" CustomerID="SG01" 
      OrderDate="2009-08-16T00:00:00"> 
    <OrderDetail ProductID="32" Quantity="3"/> 
    </Order> 
    </Customer> 
</ROOT>' 

要在行集查看该XML数据,您需要执行以下语句:

1。创建XML文档的内部表示EXEC sp_xml_preparedocument @Doc OUTPUT, @XMLDoc

2.执行以下查询使用OPENXML函数存储在一个表中的数据:

INSERT INTO CustomerDetails 
SELECT * 
FROM openxml (@Doc, '/ROOT/Customer' , 1) 
     WITH (CustomerID varchar(10), 
      Name varchar(20)) 

的数据将被显示为表:


CustomerID | Name | 
___________|_________| 
JH01  | Jack | 
      |   | 
SG01  | Steve | 
___________|_________| 

通过执行

EXEC sp_xml_removedocument @Doc 

您现在已经完成从内存中移除内部树。

我认为这种方法会帮助而不是另一个,即将XML数据存储为XML列。

+0

此外,您可以使用此链接 http://msdn2.microsoft.com/en-us/library/ms190936.aspx – Zaki 2009-06-22 22:12:05

相关问题