【发布时间】:2020-09-14 23:06:23
【问题描述】:
代码将运行,但它没有从下面的 XML 片段返回我需要的所有值。如果存在> 1个当前或以前的状态以及在何处存在,我如何进行迭代,我如何调整以返回 CurrentStatus_1 = 1 vs CurrentStatus_1 =31
<account_status_counters>
<account type="current" description="Pays Account as Agreed" status="1">31</account>
<account type="current" description="Pays/Paid 60-90 Days or Max 3 Payments Past Due" status="3">1</account>
<account type="current" description="Bad Debt" status="9">2</account>
<account type="former" description="Pays/Paid 30-60 Days or Max 2 Payments Past Due" status="2">3</account>
<account type="former" description="Pays/Paid 60-90 Days or Max 3 Payments Past Due" status="3">1</account>
<account type="former" description="Bad Debt" status="9">6</account>
</account_status_counters>
;with XMLNAMESPACES ('http://cp.com/rules/client' as ns1)
select
id,
cast(CS.CreditScoreXML as xml).value('(ns1:ncf_report/ns1:admin/ns1:product_reference)[1]', 'varchar(15)') as Ref_Number,
cast(CS.CreditScoreXML as xml).value('(ns1:ncf_report/ns1:report/ns1:summary/ns1:account_status_counters/ns1:account[@type="current" and @status ="1"]/@description)[1]', 'varchar(50)') as CurrentDescription_1,
cast(CS.CreditScoreXML as xml).value('(ns1:ncf_report/ns1:report/ns1:summary/ns1:account_status_counters/ns1:account[@type="current" and @status ="1"])[1]', 'int') as CurrentStatus_1,
cast(CS.CreditScoreXML as xml).value('(ns1:ncf_report/ns1:report/ns1:summary/ns1:account_status_counters/ns1:account[@type="current" and @status =" "]/@description)[1]', 'varchar(50)') as CurrentDescription_2,
cast(CS.CreditScoreXML as xml).value('(ns1:ncf_report/ns1:report/ns1:summary/ns1:account_status_counters/ns1:account[@type="current" and @status =" "])[1]', 'int') as CurrentStatus_2,
cast(CS.CreditScoreXML as xml).value('(ns1:ncf_report/ns1:report/ns1:summary/ns1:account_status_counters/ns1:account[@type="current" and @status =" "]/@description)[1]', 'varchar(50)') as CurrentDescription_3,
cast(CS.CreditScoreXML as xml).value('(ns1:ncf_report/ns1:report/ns1:summary/ns1:account_status_counters/ns1:account[@type="current" and @status =" "])[1]', 'int') as CurrentStatus_3,
cast(CS.CreditScoreXML as xml).value('(ns1:ncf_report/ns1:report/ns1:summary/ns1:account_status_counters/ns1:account[@type="former" and @status ="1"]/@description)[1]', 'varchar(50)') as FormerDescription_1,
cast(CS.CreditScoreXML as xml).value('(ns1:ncf_report/ns1:report/ns1:summary/ns1:account_status_counters/ns1:account[@type="former" and @status ="1"])[1]', 'int') as FormerStatus_1,
cast(CS.CreditScoreXML as xml).value('(ns1:ncf_report/ns1:report/ns1:summary/ns1:account_status_counters/ns1:account[@type="former" and @status =" "]/@description)[1]', 'varchar(50)') as FormerDescription_2,
cast(CS.CreditScoreXML as xml).value('(ns1:ncf_report/ns1:report/ns1:summary/ns1:account_status_counters/ns1:account[@type="former" and @status =" "])[1]', 'int') as FormerStatus_2,
cast(CS.CreditScoreXML as xml).value('(ns1:ncf_report/ns1:report/ns1:summary/ns1:account_status_counters/ns1:account[@type="former" and @status =" "]/@description)[1]', 'varchar(50)') as FormerDescription_3,
cast(CS.CreditScoreXML as xml).value('(ns1:ncf_report/ns1:report/ns1:summary/ns1:account_status_counters/ns1:account[@type="former" and @status =" "])[1]', 'int') as FormerStatus_3
from Database.dbo.CreditData CS
【问题讨论】:
-
在提出问题时,您需要提供一个可重现的最小示例。请参考以下链接:stackoverflow.com/help/minimal-reproducible-example 请提供以下内容: (1) DDL 和样本数据填充,即 CREATE table(s) 加上 INSERT T-SQL 语句。 (2) 你需要做什么,即逻辑,你的代码尝试实现它。 (3) 基于上述#1 中的样本数据的期望输出。 (4) 你的 SQL Server 版本 (SELECT @@version;)
标签: xml tsql xquery sql-server-2016 xml-namespaces