Sql 如何从xml字段中提取值

Sql 如何从xml字段中提取值,sql,sql-server,xml,Sql,Sql Server,Xml,我有一个带有xml的字段,类似这样: <ApplicationProductFields> <string> <field name="Tech_LoginUzytkownika">lechowski</field> </string> <int /> <decimal /> <bool /> <datetime /> <appendix />

我有一个带有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>
我发现sql查询此sql查询:

SELECT 
col.value('(/ArrayOfEntityPropertyOfString/EntityPropertyOfString[Name="Profit Center"]/Value)[1]', 'int')
FROM tbl
但我不知道如何在xml构造中使用它

有人帮我吗

您所发现的是一个。这种在XML上运行的查询语言有一个相当简单的语法,其中描述了从XML文档访问节点所需的路径。是的,并且以一种更容易访问的方式对其进行了很好的记录

我将让您查看文档,并为您的
rodzajPrzesylki
字段提供一个XPath示例:

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

如果此XML及其生成由您控制,您应该考虑:

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

  • 我认为,第一个字母(“sPP”或“d08/24…”)是一种数据类型标记(字符串和日期),这非常不专业。。。如果您想标记这个,最好使用类型属性或模式

  • 您提供的XML不完整(我必须用一些标记关闭XML),也没有显示目标表的结构。 无论如何:首先要做的是分解XML。这将创建一个派生表。在我的示例中,我将使用
    CTE
    SELECT
    语句提供此表。最后你会看到
    SELECT*fromCTE。这将提供结果集,就像从普通表中获取一样:

    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>';
    
    就放点像这样的东西

    INSERT INTO MyTargetTable(FieldName, rodarodzajPrzesylki, ...)
    SELECT FieldName,rodzajPrzesylki,... 
    FROM CTE
    
    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