在此之前,我还没有问过任何问题,所以请多多包涵。
我需要使用存储在数据库字段中的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 = ‘’
返回所有数据行,但重复每个项目,因此无法分辨哪些数据与哪个帐户相关。
帮助将不胜感激!如果您需要进一步澄清,请告诉我。先感谢您!
这应该让您开始
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句