在sql server中将xml列值编码为xml

Posted

技术标签:

【中文标题】在sql server中将xml列值编码为xml【英文标题】:Encode xml column values as xml in sql server 【发布时间】:2009-06-02 12:12:34 【问题描述】:

我有一个方法是直接从数据库中获取 vales,构建一个 xml 字符串,然后将 xml 写入一个文件。

这很好,直到我得到特殊字符,例如“'”、“

有没有人知道 Sql Server 中有什么东西可以让我在选择值时对它们进行编码?例如;

select encode(service_status) from myTable

谢谢。

【问题讨论】:

你能添加你的sql server版本吗... 哇!真的很伤心!但是你不能在 C# 中写一个小函数来做同样的事情并将它添加到 SQL Server 上吗? 我已经添加了对一篇优秀文章的引用。 请编辑问题以说明在 SQL Server 中完成了哪些部分以及在调用应用程序中完成了哪些部分。不清楚。 【参考方案1】:

使用FOR XML 子句。

它可以自动从多个值构建XML

WITH  q AS (
        SELECT  'Barnes & Noble' AS shop
        UNION ALL
        SELECT  'Marks & Spencer'
        )
SELECT  *
FROM    q
FOR XML AUTO, TYPE

---
<q shop="Barnes &amp; Noble" /><q shop="Marx &amp; Spencer" />

如果您只想对现有值进行编码,请使用:

SELECT  'Barnes & Noble'
FOR XML PATH('')

---
Barnes &amp; Noble

【讨论】:

"FOR XML" 也存在于 SQL 2000 中。 msdn.microsoft.com/en-us/magazine/cc163782.aspx @Mitch:我以为只是 2005 年以后,但@gbn 的链接改变了我的想法。 SQL 2005 添加了 XPath/Xquery + xml 数据类型 + 通常使事情变得更好。没有更多的“sp_xmlpreparedocument”! 如果我想直接在 sql server 中构建 xml,但我只想对数据进行编码 - xml 已经在查询返回的应用程序中构建。【参考方案2】:

你不需要 CLR 也可以在 sql 中执行...

create function [dbo].[fn_XMLEscape]( @s varchar(max)) returns varchar(max)
as 
begin
  declare @rs varchar(max) 
  set @rs = @s
  set @rs = replace(@rs, '&', '&amp;')
  set @rs = replace(@rs, '''', '&apos;')
  set @rs = replace(@rs, '"', '&quot;')
  set @rs = replace(@rs, '>', '&gt;')
  set @rs = replace(@rs, '<', '&lt;')
  Return( @rs)
end

【讨论】:

【参考方案3】:

如果您有 >= sql 2005,我认为将您的值填充到 xml 元素中然后将其拉回可能是最简单的。这将实体化任何需要编码的东西。

declare @x xml, @str varchar(8000), @encStr varchar(8000)
set @x = '<a/>'
set @str = '><&'

set @x.modify(
    'insert textsql:variable("@str")
    as first into (/a)[1]')

set @encStr = CAST(@x.query('/a/text()') as varchar(8000))
select @encStr
--returns: &gt;&lt;&amp;

【讨论】:

【参考方案4】:

如果调用应用程序正在构建您返回到 XML 中的内容,则由调用应用程序对数据进行编码。如果您想从 SQL Server 返回 XML,那么这取决于您,Quassnoi 的“FOR XML”答案是正确的。

【讨论】:

【参考方案5】:

如果您使用的是 SQL Server 版本 2005/2008,那么您很幸运,因为您可以使用 CLR Functions 创建自己的 ENCODE 函数。

A really good article can be found here.

【讨论】:

我没有使用 .net :( 我使用的是基于 JAVA 的 BPM 套件 :( :( 否则就完美了【参考方案6】:

我的变种:

创建函数 dbo.fn_XmlEncode (@STR varchar(200))
返回 varchar(200)
作为
开始
    如果 CHARINDEX('&', @STR) > 0
    开始
       声明 @POS1 整数,@POS2 整数
       SET @POS1 = CHARINDEX('&', @STR)
       当@POS1 > 0 开始时
           IF SUBSTRING(@STR, @POS1, 5)  '&'
              SET @STR = LEFT(@STR, @POS1 - 1) + '&'
                  + 当@POS1  0
       设置@STR = 替换(@STR,'', @STR) > 0
       SET @STR = REPLACE(@STR, '>', '>')
    返回@STR
结尾
去
-- 测试
SELECT dbo.fn_XmlEncode('&&'), dbo.fn_XmlEncode('&"&&')

【讨论】:

以上是关于在sql server中将xml列值编码为xml的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL Server Management Studio 中将列值设置为 NULL?

在 Sql Server 中将 xml 文档作为存储过程的参数传递是不是安全?

尝试将 XML 内容存储到 SQL Server 2005 中失败(编码问题)

将 XML 插入 SQL Server 时如何解决“无法切换编码”错误

如何在 SQL 中将带有其他字段的 XML 解析为多行?

在 SQL 中将 XML 文档转换为表格数据集的有效方法,因为随着 xml 的增长,交叉应用 xml 查询的性能呈指数级下降