我之前没有问过这个问题,所以请耐心等待。
我需要使用存储在数据库字段中的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 = ‘’
返回所有数据行但重复每个项目,因此无法确定哪些数据与哪个帐户相关。
非常感谢帮助!如果您需要进一步说明,请告诉我。提前谢谢!
答案 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