使用SQL

时间:2016-02-29 21:08:23

标签: sql

我之前没有问过这个问题,所以请耐心等待。

我需要使用存储在数据库字段中的SQL来提取一些XML。我之前从未这样做过,所以我在这里使用了各种不同的问题来实现这一目标。然而,数据结构的方式似乎无法提取我需要的东西。

XML的格式与下面的格式类似(我简化并重命名了标签,我无法控制XML或数据库结构)。

<acc>
    <accholder>
        <startdate>10/10/15</startdate>
        <tag>item</tag>
    </accholder>
    <default>
        <bal>123</bal>
    </default>
    <accdetails>
        <balance>400</balance>
    </accdetails>
    <acchistory>
        <ah code="a"/>
        <ah code="b"/>
    </acchistory>
</acc>
<acc>
    <accholder>
        <startdate>01/02/16</startdate>
        <tag>item</tag>
    </accholder>
    <accdetails>
        <balance>50</balance>
    </accdetails>
    <acchistory>
        <ah code="d"/>
        <ah code="b"/>
    </acchistory>
</acc>
<acc>
    <accholder>
        <startdate>09/10/15</startdate>
        <tag>item</tag>
    </accholder>
    <delinquent>
        <bal>123</bal>
    </delinquent>
    <accdetails>
        <balance>90</balance>
    </accdetails>
    <acchistory>
        <ah code="a"/>
        <ah code="s"/>
    </acchistory>
</acc>

基本上我需要它为每个帐户返回一行,其中包含特定的详细信息,例如

ACC 1, accholder.startdate, accdetails.balance, acchistory.ah.@code, default.bal (not all have default), delinquent.bal (not all have delinqent)

我使用过这种方法

SELECT DISTINCT 
    ID
    , i.c.value(‘(//wf:accholderdetails/wf:starddate/text()[1]’,’varchar(100)’) as startdate
    , i.c.value (‘(//wf:accdetails/wf:balance/text())[1]’,’varchar(100)’) as balance
FROM 
    TABLE T
    CROSS APPLY RESULT.nodes(‘//wf:acc’) as i(c)
WHERE 
    ID = ‘’

返回我想要的一行相关数据,但只返回第一行而不是任何其他数据行。

在哪里

SELECT DISTINCT
    ID
    , i.c.value(‘(wf:balance/text())[1]’,’varchar(100)’) as  balance
    ,j.c.value(‘(wf:startdate/text())[1]’,’varchar(100)’) as startdate
FROM 
    TABLE t
    CROSS APPLY RESULT.nodes(‘//wf:accdetails’) as i(c)
    CROSS APPLY RESULT.nodes(‘//wf:accholder’) as j(c)
WHERE 
    ID = ‘’

返回所有数据行但重复每个项目,因此无法确定哪些数据与哪个帐户相关。

非常感谢帮助!如果您需要进一步说明,请告诉我。提前谢谢!

1 个答案:

答案 0 :(得分:0)

这应该让你入门

SELECT    
    i.c.query('(./accholder/startdate/text())') as startdate
    ,i.c.query ('(./accdetails/balance/text())') as 'default.bal'
    ,i.c.query ('(./delinquent/bal/text())') as 'delinquent.bal'
    ,COALESCE(convert(varchar(10), i.c.query('data(./acchistory/ah/@code)')),'') as 'acchistory.ah.code'
FROM 
    @myxml.nodes('//acc') as i(c)

它返回:

09/10/15    90  123 a s