TSQL-openxml解码具有编码值的xml元素

TSQL-openxml解码具有编码值的xml元素,xml,sql-server-2008,tsql,Xml,Sql Server 2008,Tsql,如果XML元素值碰巧被编码,有没有办法阻止SQLServer2008对其进行解码 例如,我有以下查询: declare @T nvarchar(max) SET @T = '<node><val>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;</val></node>' declare @doc nvarchar(ma

如果XML元素值碰巧被编码,有没有办法阻止SQLServer2008对其进行解码

例如,我有以下查询:

declare @T nvarchar(max)
SET @T = '<node><val>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;</val></node>'

declare @doc nvarchar(max), @idoc int
SET @doc = @T

exec sp_xml_preparedocument @idoc output, @doc;

select * from openxml (@idoc, '//*')

exec sp_xml_removedocument @idoc;

这是正确的行为。通过使用诸如
之类的实体,您只需对这些值进行编码以存储在XML节点中。您正在存储
您可以使用XML数据类型并将
query()
的结果强制转换为
nvarchar(max)

declare@xxml
设置@X=”?xml version=“1.0”encoding=“UTF-8”?'
选择cast(@X.query('/node/val/text()')作为nvarchar(max))
结果

?xml version=“1.0”encoding=“UTF-8”?
<?xml version="1.0" encoding="UTF-8"?>
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
declare @T nvarchar(max)
SET @T = '<node><val>&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;</val></node>'

declare @doc nvarchar(max), @idoc int
SET @doc = @T

exec sp_xml_preparedocument @idoc output, @doc;

select * from openxml (@idoc, '//*')

exec sp_xml_removedocument @idoc;
declare @T nvarchar(max)
SET @T = '<node><val><![CDATA[&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;]]></val></node>'

declare @doc nvarchar(max), @idoc int
SET @doc = @T

exec sp_xml_preparedocument @idoc output, @doc;

select * from openxml (@idoc, '//*')

exec sp_xml_removedocument @idoc;