没有XML编码的SQLXML?

栏目: 编程语言 · XML · 发布时间: 7年前

内容简介:http://stackoverflow.com/questions/3202415/sqlxml-without-xml-encoding
我正在使用通用系统进行报告,从数据库视图(SQL Server 2005)获取数据.在这个视图中,我不得不在一行中从一对多关系中合并数据,并使用 priyanka.sarkar 在此线程中描述的解决方案: Combine multiple results in a subquery into a single comma-separated value

.该解决方案使用SQLXML来合并数据(子查询):

SELECT STUFF(
    (    SELECT ', ' + Name 
         FROM MyTable _in 
         WHERE _in.ID = _out.ID 
         FOR XML PATH('')),        -- Output multiple rows as one xml type value,
                                   -- without xml tags
    1, 2, '')      -- STUFF: Replace the comma at the beginning with empty string
FROM MyTable _out 
GROUP BY ID        -- Removes duplicates

这完美的工作(甚至没有那么沉重的表现),除了我的数据现在通过SQLXML获得XML编码(& =& amp; amp; amp; amp;等) – 我不想要XML数据,我只是把它用作一个诡计 – 由于通用系统,我无法对其进行编码以将其清理干净,因此编码数据直接转到报告中.我不能使用通用系统的存储过程,所以CURSOR合并或COALESCE-ing在这里不是一个选项…

所以我正在寻找的是T-SQL中的一种方式,可以让我再次解码XML,甚至更好:避免SQLXML进行编码.显然,我可以编写一个这样做的存储函数,但是我更喜欢内置,更安全的方式…

谢谢你的帮助…

如果将类型指定为xml的选项,则可以使用XPath查询将XML类型转换回varchar.使用示例表变量:

declare @MyTable table (id int, name varchar(50))

insert @MyTable (id, name) select 1, 'Joel & Jeff'
union all select 1, '<<BIN LADEN>>'
union all select 2, '&&BUSH&&'

一个可能的解决方案是:

select  b.txt.query('root').value('.', 'varchar(max)')
from    (
        select  distinct id
        from    @MyTable
        ) a
cross apply
        (
            select  CASE ROW_NUMBER() OVER(ORDER BY id) WHEN 1 THEN '' 
                        ELSE ', ' END + name
        from    @MyTable
        where   id = a.id
        order by 
                id
        for xml path(''), root('root'), type
        ) b(txt)

这将打印:

Joel & Jeff, <<BIN LADEN>>
&&BUSH&&

这是一个没有XML转换的替代方案.它确实有一个递归查询,所以性能里程可能会有所不同.是从 Quassnoi’s blog

;WITH   with_stats(id, name, rn, cnt) AS
        (
        SELECT  id, name,
                ROW_NUMBER() OVER (PARTITION BY id ORDER BY name),
                COUNT(*) OVER (PARTITION BY id)
        FROM    @MyTable
        ),
        with_concat (id, name, gc, rn, cnt) AS
        (
        SELECT  id, name,
                CAST(name AS VARCHAR(MAX)), rn, cnt
        FROM    with_stats
        WHERE   rn = 1
        UNION ALL
        SELECT  with_stats.id, with_stats.name,
                CAST(with_concat.gc + ', ' + with_stats.name AS VARCHAR(MAX)),
                with_stats.rn, with_stats.cnt
        FROM    with_concat
        JOIN    with_stats
        ON      with_stats.id = with_concat.id
                AND with_stats.rn = with_concat.rn + 1
        )
SELECT  id, gc
FROM    with_concat
WHERE   rn = cnt
OPTION  (MAXRECURSION 0)

http://stackoverflow.com/questions/3202415/sqlxml-without-xml-encoding


以上所述就是小编给大家介绍的《没有XML编码的SQLXML?》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Head First Rails

Head First Rails

David Griffiths / O'Reilly Media / 2008-12-30 / USD 49.99

Figure its about time that you hop on the Ruby on Rails bandwagon? You've heard that it'll increase your productivity exponentially, and allow you to created full fledged web applications with minimal......一起来看看 《Head First Rails》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

SHA 加密
SHA 加密

SHA 加密工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具