代码之家  ›  专栏  ›  技术社区  ›  Benny

用于XML编码的TSQL反向

  •  0
  • Benny  · 技术社区  · 14 年前

    我在查询中使用for xml将多行连接在一起,但文本包含引号、“<”、“>”等。我需要实际字符而不是像“”等编码值。有什么建议吗?

    3 回复  |  直到 12 年前
        1
  •  1
  •   Richard Forss    14 年前

    我有一个类似的要求来提取列名称,以便在透视查询中使用。

    我使用的解决方案如下:

    SELECT @columns = STUFF((SELECT '],[' + Value
                                   FROM Table
                                  ORDER BY Value
                                    FOR XML PATH('')), 1, 2, '') + ']'
    

    这将生成一个字符串:

    [Value 1],[Value 2],[Value 3]
    

    我希望这能给你指明正确的方向。

        2
  •  3
  •   Remus Rusanu    14 年前

    基本上,您所要求的是无效的XML,幸运的是,SQL Server不会生成它。您可以获取生成的XML并提取内容,此操作将转义字符还原为它们的文本表示形式。这种恢复通常发生在prenetaitonlayer中,但它可以通过实例在SQL Server itslef中发生,使用XML方法提取为XML输出生成的内容。例如:

    declare @text varchar(max) = 'this text has < and >';
    declare @xml xml;
    
    set @xml = (select @text as [node] for xml path('nodes'), type);
    
    select @xml;
    select x.value(N'.', N'varchar(max)') as [text]
    from @xml.nodes('//nodes/node') t(x);
    
        3
  •  0
  •   teamchong    12 年前
    --something like this?
    SELECT * INTO #Names FROM (
       SELECT Name='<>&' UNION ALL
       SELECT Name='ab<>'
    ) Names;
    -- 1)
    SELECT STUFF(
        (SELECT ', ' + Name FROM #Names FOR XML PATH(''))
        ,1,2,'');
    -- 2)
    SELECT STUFF(
        (SELECT ', ' + Name FROM #Names FOR XML PATH(''),TYPE).value('text()[1]','nvarchar(max)')
        ,1,2,'');
    -- 2) is slower but will not return encoded value.
    

    希望能有所帮助。