【问题标题】:How do I parse this XML from a database field in MSSQL如何从 MSSQL 中的数据库字段解析此 XML
【发布时间】:2015-08-18 11:58:09
【问题描述】:

我在 sql 查询的字段中拥有这个 XML,但我想从中提取 EventID。

<Form>
  <Row LegID="1" EventID="8242323" MarType="WIN" DivType="FIXED" FMid="26881933" oID="4" />
  <Row LegID="2" EventID="8274278" MarType="WIN" DivType="FIXED" FMid="27000091" oID="1" />
  <Row LegID="3" EventID="8274189" MarType="HCWEST" DivType="FIXED" FMid="26999824" oID="2" />
  <Row LegID="4" EventID="8243036" MarType="WIN" DivType="FIXED" FMid="26884162" oID="2" />
  <Row LegID="5" EventID="8246510" MarType="WIN" DivType="FIXED" FMid="26898727" oID="2" />
  <Row LegID="6" EventID="8301802" MarType="WIN" DivType="FIXED" FMid="27101445" oID="4" />
  <Row LegID="7" EventID="8305000" MarType="WIN" DivType="FIXED" FMid="27111681" oID="1" />
  <Row LegID="8" EventID="8299986" MarType="WIN" DivType="FIXED" FMid="27095255" oID="1" />
</Form>

我已经尝试使用this page 中的“Shredding XML”部分,但我猜这不起作用,因为我的 XML 不是由每个项目的打开和关闭标签形成的。

有人知道我要做的任务叫什么吗?

//编辑//

太棒了,我可以阅读它,但我有一个后续问题。 我的选择是这样的:

SELECT LegNumber, X.Col.value('(Row/@EventID)[1]', 'varchar(25)') AS 'EventID'
FROM myTable mt
CROSS APPLY mt.MultiLegXML.nodes('/Form') as X(Col)

LegNumber 是一个 int,对应于 XML 中的 LegIDIf LegNumber = 2,如何从第二行读取 EventID? (Where LegID = 2)

【问题讨论】:

    标签: sql-server xml


    【解决方案1】:

    希望对你有帮助

        declare @xml xml;
        set @xml = '<Form>
          <Row LegID="1" EventID="8242323" MarType="WIN" DivType="FIXED" FMid="26881933" oID="4" />
          <Row LegID="2" EventID="8274278" MarType="WIN" DivType="FIXED" FMid="27000091" oID="1" />
          <Row LegID="3" EventID="8274189" MarType="HCWEST" DivType="FIXED" FMid="26999824" oID="2" />
          <Row LegID="4" EventID="8243036" MarType="WIN" DivType="FIXED" FMid="26884162" oID="2" />
          <Row LegID="5" EventID="8246510" MarType="WIN" DivType="FIXED" FMid="26898727" oID="2" />
          <Row LegID="6" EventID="8301802" MarType="WIN" DivType="FIXED" FMid="27101445" oID="4" />
          <Row LegID="7" EventID="8305000" MarType="WIN" DivType="FIXED" FMid="27111681" oID="1" />
          <Row LegID="8" EventID="8299986" MarType="WIN" DivType="FIXED" FMid="27095255" oID="1" />
        </Form>';
    
    
        select 
              C.value('@EventID', 'bigint') col
        from
             @xml.nodes('Form/Row') as X(C)
    

    更新问题后

     select 
              C.value('@EventID', 'bigint') col
        from
             @xml.nodes('Form/Row') as X(C)
             where C.value('@LegID', 'bigint') = 2
    

    【讨论】:

    • 感谢 tinka,它看起来更干净。如果您对我有更多想法,我刚刚编辑了我的问题 :-) 干杯,马里奥
    【解决方案2】:

    如果您只想从 XML 列中为表中的每一行返回一个值,则不需要分解。使用sql:column() 函数从 XQuery 访问表列中的值:

    SELECT 
        LegNumber, 
        MultiLegXML.value('(/Form/Row[@LegID=sql:column("LegNumber")]/@EventID)[1]', 'varchar(25)') AS 'EventID'
    FROM myTable mt
    

    Sqlfiddle Demo

    输出:

    | LegNumber | EventID |
    |-----------|---------|
    |         2 | 8274278 |
    

    如果一个 XML 数据可能返回多个 EventID 值,则需要进行粉碎,例如:

    SELECT 
        LegNumber, 
        X.Col.value('@EventID', 'varchar(25)') AS 'EventID'
    FROM myTable mt
    CROSS APPLY mt.MultiLegXML.nodes('/Form/Row') as X(Col)
    

    【讨论】:

      【解决方案3】:

      好吧,我跌跌撞撞地通过了。 :-)

      SELECT *, X.Col.value('(Row/@EventID)[1]', 'varchar(25)') AS 'EventID'
      FROM myTable mt
      CROSS APPLY mt.MultiLegXML.nodes('/Form') as X(Col)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-19
        • 2017-07-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多