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

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

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

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

select encode(service_status) from myTable

谢谢。

【问题讨论】:

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

标签: sql-server xml


【解决方案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 text{sql: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('&"&&')

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-04-07
          • 2014-03-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多