SQL Server xml 路径中的 XML 格式

Posted

技术标签:

【中文标题】SQL Server xml 路径中的 XML 格式【英文标题】:XML formatting in SQL Server xml path 【发布时间】:2019-09-18 04:57:45 【问题描述】:

我正在尝试通过查询 SQL Server 来获取特定的 XML 格式。

我的嵌套查询如下所示:

SELECT 
    @xml = (SELECT 
                AdmissionID AS "@encounter_number",
                'NDIS' AS organisation_code,
                'NDIS' AS encounter_type,
                (SELECT 'true' as "@delete",
                    (SELECT 'NDIS' AS class_type, AdmissionDate AS start_date_time 
                     FOR XML PATH ('financial_class'), TYPE) 
                 FOR XML PATH('financial_classes'), TYPE),
                (SELECT URNumber AS 'payor/@entity_number', 'Patient' AS slot, CONVERT (varchar(10), AdmissionDate, 126) AS start_date 
                 FOR XML PATH('payor'), ROOT ('payors'), ELEMENTS, TYPE),
                URNumber AS "recipient/@entity_number",
                'H' AS referral_source,
                'H' AS separation_status,
                AdmissionDate AS start_date_time
            FROM 
                HMS
            FOR XML PATH('encounter'), ROOT ('pbrc'), TYPE)

返回此输出:

<pbrc>
  <encounter encounter_number="525241">
    <organisation_code>NDIS</organisation_code>
    <encounter_type>NDIS</encounter_type>
    <financial_classes delete="true">
      <financial_class>
        <class_type>NDIS</class_type>
        <start_date_time>2018-06-26T00:00:00</start_date_time>
      </financial_class>
    </financial_classes>
    <payors>
      <payor>
        <payor entity_number="4208151" />
        <slot>Patient</slot>
        <start_date>2018-06-26</start_date>
      </payor>
    </payors>
    <recipient entity_number="4208151" />
    <referral_source>H</referral_source>
    <separation_status>H</separation_status>
    <start_date_time>2018-06-26T00:00:00</start_date_time>
  </encounter>
</pbrc>

但我正在尝试使用适当的付款人结束标签而不是简短形式为付款人实现以下格式,

-<payors>
 -<payor>
 <payor entity_number="8195991"> </payor>

 <slot>Patient</slot>

 <start_date>2019-06-01</start_date>

 </payor>

</payors>

请问有什么建议吗?

【问题讨论】:

【参考方案1】:

这是一条评论,但我把它变成了答案:

您是否知道 - 从语义上讲 - 没有区别 在&lt;SomeElement /&gt;&lt;SomeElement&gt;&lt;/SomeElement&gt; 之间?是个 blank&lt;payor&gt;&lt;/payor&gt; 之间重要吗?其实已经上 到呈现引擎,这将是如何看待的。相同的 XML 可能 以不同的形状出现在观众身上......

你可以试试这个:

DECLARE @mockPayor TABLE(enitityNumber INT,slot VARCHAR(100));
INSERT INTO @mockPayor VALUES(123,'slot123')

--这将返回 self-closed 付款人元素

SELECT p.enitityNumber AS [payor/@entityNumber]
      ,p.slot
FROM @mockPayor p
FOR XML PATH('payor')

结果

<payor>
  <payor entityNumber="123" />
  <slot>slot123</slot>
</payor>

这将返回正确的付款人结束标签

SELECT p.enitityNumber AS [payor/@entityNumber]
      ,' ' AS [payor]
      ,p.slot
FROM @mockPayor p
FOR XML PATH('payor');

结果

<payor>
  <payor entityNumber="123"> </payor>
  <slot>slot123</slot>
</payor>

一些背景:

引擎对此进行处理并认为:

好的,payor 元素中有一个 entityNumber 属性。好吧,我必须打开 payor 元素并插入 entityNumber。 现在有一个插槽元素。所以我必须关闭付款人没有任何内容并打开 slot 元素。

在第二个语句中,引擎认为:

同上 现在有一些内容要放入付款人元素 同上,但将粗体部分替换为内容后

【讨论】:

感谢您的详细解释。非常感激。是的,我知道在语义上没有区别。但我正在为需要这种特定格式的“愚蠢”发票软件创建这个 xml。

以上是关于SQL Server xml 路径中的 XML 格式的主要内容,如果未能解决你的问题,请参考以下文章

sql XML Schema Collection,SQL Server中的Type vs Untyped XML

SQL XML - 从 SQL Server 为发票创建一个 XML 文件,包括一个 XML 文件中的发票位置

SQL Server 中的 XML 列比较

sql SQL Server中的XML索引,主要和辅助

从sql server中的xml中提取数据

SQL Server 中的 XML 查询