【发布时间】:2017-12-04 22:36:58
【问题描述】:
如何将表中已经采用 XML 格式的列中的值创建为 XML 中属性的值并保留其 XML 格式(括号、引号等)? (似乎正在发生的事情的术语是字符(,“)正在被实体化。)(SQL SERVER 2008 R2)
declare @T table (
ID int identity,
Col1 varchar(200),
Col2 varchar(max)
);
insert @T
select 'ABC', 'Value01'
union
select 'DEF', '<Ele01>A01</Ele01>'
union
select 'GHI', '<Elements><Ele02>A02</Ele02><Ele03>A03</Ele03></Elements>'
union
select 'JKL', '<Ele04 Att01="V01" Att02="V02" />';
select (
select
Col1 as '@Col1',
Col2 as '@Col2'
from @T
for xml path(N'Item'), type
) as TValues
for xml path(N'T'), type, elements xsinil;
结果应该是这样的:
<T xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<TValues>
<Item Col1="ABC" Col2="Value01" />
<Item Col1="DEF" Col2="<Element01>A01</Element01>" />
<Item Col1="GHI" Col2="<Elements><Element02>A02</Element02><Element03>A03</Element03></Elements>" />
<Item Col1="JKL" Col2="<Element04 Att01="V01" Att02="V02" />" />
</TValues>
</T>
这是实际结果:
<T xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<TValues>
<Item Col1="ABC" Col2="Value01" />
<Item Col1="DEF" Col2="<Element01>A01</Element01>" />
<Item Col1="GHI" Col2="<Elements><Element02>A02</Element02><Element03>A03</Element03></Elements>" />
<Item Col1="JKL" Col2="<Element04 Att01="V01" Att02="V02" />" />
</TValues>
</T>
我已经搜索了一个答案,这些是我能找到的一些唯一可以解决这个问题的链接: http://blogs.lobsterpot.com.au/2010/04/15/handling-special-characters-with-for-xml-path/ How do I avoid character encoding when using "FOR XML PATH"? https://www.red-gate.com/simple-talk/sql/learn-sql-server/using-the-for-xml-clause-to-return-query-results-as-xml/
我知道我可以在事后替换实体化字符,但我相信一定有更好的方法。 我非常感谢知道如何实现这一目标的人的帮助。
如果我的问题没有达到别人的标准,我深表歉意。
【问题讨论】:
-
在 XML 中,你的“应该看起来像”只能是:
<Item Col1="DEF" Col2="<![CDATA[<Element01>A01</Element01>]]" /> or- ` - 你有它:-)
-
嗯..之后的xml部分结果应该是这样的:不是一个有效的xml。
标签: sql-server xml sql-server-2008-r2 for-xml-path