如何从xml字段中提取值

时间:2017-01-13 09:18:35

标签: sql sql-server xml

我有一个带有xml的字段,如下所示:

<ApplicationProductFields>
  <string>
    <field name="Tech_LoginUzytkownika">lechowski</field>
  </string>
  <int />
  <decimal />
  <bool />
  <datetime />
  <appendix />
  <enum />
  <complex>
    <field name="danePrzesylki">
      <fv>
        <rodzajPrzesylki>sPP</rodzajPrzesylki>
        <dataWplywu>d08/24/2016 00:00:00</dataWplywu>
        <nadawcaNazwisko>sKowalski</nadawcaNazwisko>
        <dokumenty>
          <tytulDokumentu>sDokument testowy 45</tytulDokumentu>
          <dataUtworzenia>d2016-06-13 00:00:00</dataUtworzenia>

我需要在不同的表字段中插入所有值,例如。

|rodzajPrzesylki|     dataWplywu     |nadawcaNazwisko|  tytulDokumentu  |...
|      sPP      |d08/24/2016 00:00:00|   sKowalski   |sDokument testowy |...

我发现sql查询这个sql查询:

SELECT 
col.value('(/ArrayOfEntityPropertyOfString/EntityPropertyOfString[Name="Profit Center"]/Value)[1]', 'int')
FROM tbl

但我不知道如何在我的xml构造中使用它。

有人帮我吗?

2 个答案:

答案 0 :(得分:0)

您找到的是XPath。这种在XML上运行的查询语言具有相当简单的语法,您可以在其中描述从XML文档访问节点所需的路径。它是defined by the w3cMDN可以更方便地记录它。

我会让您查看文档并为您的rodzajPrzesylki字段提供XPath示例:

/ApplicationProductFields/complex/field[name="danePrzesylki"]/fv/rodzajPrzesylki

答案 1 :(得分:0)

如果这个XML及其生成在你的控制之下,你应该考虑一下:

  1. 未正确生成XML。 XML中的日期/时间值应遵循ISO8601 ...您必须手动转换它们。

  2. 我认为,第一个字母(“sPP”或“d08 / 24 ......”)是一种数据类型标记(字符串和日期),这是非常不专业的...如果你是想要标记这一点,更好地使用类型属性或模式......

  3. 您提供的XML不完整(我必须使用某些标记关闭XML),您也没有显示目标表的结构。 无论如何:要做的第一件事就是粉碎XML。这将创建一个派生表。在我的示例中,我将使用CTESELECT语句提供此表。最后,您会看到SELECT * FROM CTE;。这将提供结果集,好像它将从普通表中获取:

    DECLARE @xml XML=
    N'<ApplicationProductFields>
      <string>
        <field name="Tech_LoginUzytkownika">lechowski</field>
      </string>
      <int />
      <decimal />
      <bool />
      <datetime />
      <appendix />
      <enum />
      <complex>
        <field name="danePrzesylki">
          <fv>
            <rodzajPrzesylki>sPP</rodzajPrzesylki>
            <dataWplywu>d08/24/2016 00:00:00</dataWplywu>
            <nadawcaNazwisko>sKowalski</nadawcaNazwisko>
            <dokumenty>
              <tytulDokumentu>sDokument testowy 45</tytulDokumentu>
              <dataUtworzenia>d2016-06-13 00:00:00</dataUtworzenia>
            </dokumenty>
          </fv>
        </field>
      </complex>
    </ApplicationProductFields>';
    

    - 查询

    WITH CTE AS
    (
        SELECT fld.value(N'@name','nvarchar(max)') AS FieldName
              ,fld.value(N'(fv/rodzajPrzesylki)[1]','nvarchar(max)') AS rodzajPrzesylki
              ,fld.value(N'(fv/dataWplywu)[1]','nvarchar(max)') AS dataWplywu
              ,fld.value(N'(fv/nadawcaNazwisko)[1]','nvarchar(max)') AS nadawcaNazwisko
              ,fld.value(N'(fv/dokumenty/tytulDokumentu)[1]','nvarchar(max)') AS tytulDokumentu
              ,fld.value(N'(fv/dokumenty/dataUtworzenia)[1]','nvarchar(max)') AS dataUtworzenia
        FROM @xml.nodes(N'/ApplicationProductFields/complex/field') AS A(fld)
    )
    SELECT * FROM CTE;
    

    只是把那些东西放在那里

    INSERT INTO MyTargetTable(FieldName, rodarodzajPrzesylki, ...)
    SELECT FieldName,rodzajPrzesylki,... 
    FROM CTE