【发布时间】:2017-07-14 15:53:13
【问题描述】:
操作系统:Windows 10
MS SQL 版本:SQL 2016
我对 StackOverflow 进行了广泛的搜索,发现了许多与我的问题非常相似的问题,但似乎没有一个问题与我的情况相匹配,或者没有一个我有知识或技能可以实施的回答。我不知道如何在 SQL 中实现 C# 解决方案,也不知道如何使用样式表转换语言,所以这是我的问题。
我正在从一个表创建一个 XML 文档,并且它必须与我客户的布局完全匹配。文档的外部结构如下所示:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<ScreenResponse xmlns="http://schemas.myuri.com/CC/v1_4">
<CustomerScreenResult>
<ServiceCallID />
<IsSuccessful>true</IsSuccessful>
<CustomerScreenResponse>
<IsSuccessful>true</IsSuccessful>
</CustomerScreenResponse>
</CustomerScreenResult>
</ScreenResponse>
</s:Body>
</s:Envelope>
上面的对象在我的存储过程中称为@xml_out,具有XML 数据类型,并且保持不变。请注意,它只使用模式和命名空间,没有样式表。接下来,我构建了另一个 XML 文档,它只显示客户需要查看的节点。它看起来像这样:
<SpecificScreenResults>
<CaseScreenResult>
<ScreenMessage>This is a sample screenmessage.</ScreenMessage>
</CaseScreenResult>
<CaseScreenResult>
<ScreenMessage>This is another sample screenmessage.</ScreenMessage>
</CaseScreenResult>
</SpecificScreenResults>
在 SSMS 中,我使用与此类似的代码创建该文档:
SET @xml_var1 = ( SELECT a.ScreenMessage
FROM #CustScrn a
FOR
XML PATH('CaseScreenResult'),
ELEMENTS,
ROOT ('SpecificScreenResults'),
TYPE);
最后,我使用 xquery insert 语句将第二个 XML 对象 (@xml_var1) 插入到第一个 XML 对象中。首先,这是我使用的 SQL 语句:
SET @xml_out.modify('declare default element namespace "http://schemas.myuri.com/CC/v1_4"; insert sql:variable ("@xml_var1") as first into (//CustomerScreenResponse)[1]');
这会产生以下 XML 对象:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<ScreenResponse xmlns="http://schemas.myuri.com/CC/v1_4">
<CustomerScreenResult>
<ServiceCallID />
<IsSuccessful>true</IsSuccessful>
<CustomerScreenResponse>
<SpecificScreenResults xmlns="">
<CaseScreenResult>
<ScreenMessage>This is a sample screenmessage.</ScreenMessage>
</CaseScreenResult>
<CaseScreenResult>
<ScreenMessage>This is another sample creenmessage.</ScreenMessage>
</CaseScreenResult>
</SpecificScreenResults>
<IsSuccessful>true</IsSuccessful>
</CustomerScreenResponse>
</CustomerScreenResult>
</ScreenResponse>
</s:Body>
</s:Envelope>
注意一个节点,SpecificScreenResults 正在接收额外的 xmlns="" 命名空间指示。我认为这是因为我插入的 XML 没有与命名空间相关联,因此添加了一个空白。我知道,从 XML 的角度来看,这个文本是微不足道的,但对我的客户来说,这是他们不想处理的烦恼。目前我处理问题的方式是将整个对象转换为 VARCHAR(MAX),使用 REPLACE() 函数将其删除,然后将其转换回 XML。这适用于有几条记录的结果,但当表结果数以百万计时,效果就不太好了。
是或否,我可以使用 xquery delete 命令从节点中删除 xmlns="" 吗?有没有更好的方法来执行插入以防止出现空白?如果是这样,有人可以提供一个例子吗?
【问题讨论】:
标签: sql-server xml