如何在SQL Server中读取格式化的xml文件

时间:2016-09-20 08:49:26

标签: sql sql-server xml import xml-parsing

我有XML文件需要SQL Server 2008从中读取一些数据。

请指导我解决这个问题。

我的XML文件:

<?xml version="1.0" encoding="utf-8"?>
<DataSet xmlns="http://tempuri.org/">
  <xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
      <xs:complexType>
        <xs:choice minOccurs="0" maxOccurs="unbounded">
          <xs:element name="Table">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="CI_CODE" type="xs:decimal" minOccurs="0" />
                <xs:element name="CI_NAME" type="xs:string" minOccurs="0" />
                <xs:element name="CI_PISH_CODE" type="xs:string" minOccurs="0" />
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:choice>
      </xs:complexType>
    </xs:element>
  </xs:schema>
  <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
    <NewDataSet xmlns="">
      <Table diffgr:id="Table1" msdata:rowOrder="0">
        <CI_CODE>1</CI_CODE>
        <CI_NAME>Kerman</CI_NAME>
        <CI_PISH_CODE>34</CI_PISH_CODE>
      </Table>
      <Table diffgr:id="Table2" msdata:rowOrder="1">
        <CI_CODE>2</CI_CODE>
        <CI_NAME>Anar</CI_NAME>
        <CI_PISH_CODE>34</CI_PISH_CODE>
      </Table>
      <Table diffgr:id="Table3" msdata:rowOrder="2">
        <CI_CODE>3</CI_CODE>
        <CI_NAME>Baft</CI_NAME>
        <CI_PISH_CODE>34</CI_PISH_CODE>
      </Table>
    </NewDataSet>
  </diffgr:diffgram>
</DataSet>

我需要帮助在SQL Server 2008中阅读此XML。

我需要标记<CI_CODE>以及<CI_NAME><CI_PISH_CODE>数据。

请指导我

2 个答案:

答案 0 :(得分:1)

假设您的XML存储在名为@Data XML的变量中,您可以使用此XQuery获取您的数据。

XPath表达式&#34;导航&#34;在节点树下面给你一个&#34;虚拟&#34; XML片段表 - 每个<Table> XML元素一个。然后,您可以使用.value() XQuery表达式从该XML元素中获取单个数据项。

您需要特别警惕为每个元素使用正确的 XML命名空间。

;WITH XMLNAMESPACES('http://tempuri.org/' AS ns, 
                    'urn:schemas-microsoft-com:xml-diffgram-v1' AS dg)
SELECT
    CI_CODE = XC.value('(CI_CODE)[1]', 'int'),
    CI_NAME = XC.value('(CI_NAME)[1]', 'varchar(50)'),
    CI_PISH_CODE = XC.value('(CI_PISH_CODE)[1]', 'int')
FROM
    @Data.nodes('/ns:DataSet/dg:diffgram/NewDataSet/Table') AS XT(XC)

这会在我的电脑上产生这个输出:

enter image description here

答案 1 :(得分:0)

总的来说,我建议你尽可能具体。在这种情况下,您有不洁的命名空间(schema级别的空默认命名空间),这使得很难正确地查询它。

尝试使用wild wildcarded namespace(*:):

编辑:简化

- 变量中的XML

DECLARE @xml XML=
'Copy your XML here';

- 查询

SELECT dgt.value('(@*:id)[1]','nvarchar(max)') AS DiffgramTable
      ,dgt.value('(*:CI_CODE)[1]','int') AS Diffgram_CI_CODE
      ,dgt.value('(*:CI_NAME)[1]','nvarchar(max)') AS Diffgram_CI_NAME
      ,dgt.value('(*:CI_PISH_CODE)[1]','int') AS Diffgram_CI_CODE
FROM @xml.nodes('/*:DataSet') AS A(ds)
OUTER APPLY ds.nodes('*:diffgram') AS C(dg)
OUTER APPLY dg.nodes('*:NewDataSet/*:Table') AS D(dgt)

首先我们选择“DataSet”并将其命名为“ds”。在下面我们选择“diffgram”(“dg”)。在“dg”下面,我们选择所有“表格”(“dgt”)

选择将从最近的节点

中读取所有信息

结果

+---------------+------------------+------------------+------------------+
| DiffgramTable | Diffgram_CI_CODE | Diffgram_CI_NAME | Diffgram_CI_CODE |
+---------------+------------------+------------------+------------------+
| Table1        | 1                | Kerman           | 34               |
+---------------+------------------+------------------+------------------+
| Table2        | 2                | Anar             | 34               |
+---------------+------------------+------------------+------------------+
| Table3        | 3                | Baft             | 34               |
+---------------+------------------+------------------+------------------+