T-SQL:将 XML 转换为没有自闭合标签的字符串

Ant*_*lev 5 xml sql-server t-sql

我们有一个奇怪的系统,我们正在与之集成,它使用 XML,但它理解自闭合标签,所以

<BOOKING>
  <BOOKINGID>56812</BOOKINGID>
  <PERSONCODE />
</BOOKING>
Run Code Online (Sandbox Code Playgroud)

超出了它的能力。

如果我拥有的是declare @x xml,我如何将其转换@x为字符串而没有自关闭标签:

<BOOKING>
  <BOOKINGID>56812</BOOKINGID>
  <PERSONCODE></PERSONCODE>
</BOOKING>
Run Code Online (Sandbox Code Playgroud)

Mik*_*son 4

解决方法是使用插入 (XML DML)将不太可能的值添加到空节点,然后替换字符串表示形式上的值。

declare @S nvarchar(max)

declare @XML xml = '
<BOOKING>
  <BOOKINGID>56812</BOOKINGID>
  <PERSONCODE />
</BOOKING>'

-- Add _ as value to all empty nodes
while @XML.exist('//*[.="" and count(*)=0]') = 1
  set @XML.modify('insert text{"_"} into (//*[.="" and count(*)= 0])[1]')

-- Cast to string and remove _ as value
set @S = replace(cast(@XML as nvarchar(max)), '>_<', '><')

select @S
Run Code Online (Sandbox Code Playgroud)