【问题标题】:Concatenating html comma seperated using for xml < &lt [duplicate]使用用于 xml < &lt [重复] 分隔的连接 html 逗号
【发布时间】:2018-05-04 21:01:49
【问题描述】:

我正在尝试编写一个存储过程,它将 SQL 查询的结果转换为 HTML 字符串,然后将它们显示在 HTML 表中。

我遇到的问题是我正在使用 FOR XML 获取一个逗号分隔的 td 值列表,然后尝试连接它,但是当我这样做时,它会丢失 &lt;&gt; 字符并替换他们使用 XML &amp;lt&amp;gt - 我需要它以 &lt;&gt; 显示它。

这是执行此操作的查询部分:

    declare C cursor for
    select (convert(nvarchar(max),(SELECT "th/@width"='50', th = name
    FROM tempdb.sys.columns isc
    WHERE object_id = OBJECT_ID('tempdb.dbo.##tempcolumns') 
            for xml PATH(N''), TYPE)))
    open C
    declare @L varchar(max)
    fetch next from C into @L
    close C
    deallocate C

    DECLARE @html nvarchar(max), @table nvarchar(max), @test nvarchar(max), @html2 nvarchar(max) 
    SET @html =  
    N'<html> <head><title>TestHTML</title></head>' + CHAR(10) + 
    N'<body style="font-family: Arial;">' + 
    N'<h1>Companies2</h1></font>' + 
    '<table style="float: left; width:100%;">' + 
    N'<tr>' + 
            @L +
    N'</tr>' + CHAR(10); 

    SELECT @table = CONVERT(nvarchar(max),(SELECT (
    SELECT  '<td>' + STUFF( ( SELECT td = ', '  + '[' + isc.name + ']' 
    FROM tempdb.sys.columns isc
    WHERE isc.object_id = OBJECT_ID('tempdb.dbo.##tempcolumns') FOR XML PATH ('')), 1,5,'')) FROM ##temp FOR XML PATH(''), TYPE))


    SET @html = @html + @table + CHAR(10) +  
                N'</table></body></html>' 

    SELECT @table

但是,这就是它返回的内容:

&lt;td&gt; [Reasons_Code]&lt;/td&gt;&lt;td&gt;, [Open]&lt;/td&gt;&lt;td&gt;, [Ordered]&lt;/td&gt;&lt;td&gt;, [Partially Ordered]&lt;/td&gt;&lt;td&gt;, [Lost]&lt;/td&gt;&lt;td&gt;, [Not Pursued]&lt;/td&gt;&lt;td&gt;, [Expired (Past 90 days)]&lt;/td&gt;&lt;td&gt;, [Pending]&lt;/td&gt;&lt;td&gt; [Reasons_Code]&lt;/td&gt;&lt;td&gt;, [Open]&lt;/td&gt;&lt;td&gt;, [Ordered]&lt;/td&gt;&lt;td&gt;, [Partially Ordered]&lt;/td&gt;&lt;td&gt;, [Lost]&lt;/td&gt;&lt;td&gt;, [Not Pursued]&lt;/td&gt;&lt;td&gt;, [Expired (Past 90 days)]&lt;/td&gt;&lt;td&gt;, [Pending]&lt;/td&gt;&lt;td&gt; [Reasons_Code]&lt;/td&gt;&lt;td&gt;, [Open]&lt;/td&gt;&lt;td&gt;, [Ordered]&lt;/td&gt;&lt;td&gt;, [Partially Ordered]&lt;/td&gt;&lt;td&gt;, [Lost]&lt;/td&gt;&lt;td&gt;, [Not Pursued]&lt;/td&gt;&lt;td&gt;, [Expired (Past 90 days)]&lt;/td&gt;&lt;td&gt;, [Pending]&lt;/td&gt;&lt;td&gt; [Reasons_Code]&lt;/td&gt;&lt;td&gt;, [Open]&lt;/td&gt;&lt;td&gt;, [Ordered]&lt;/td&gt;&lt;td&gt;, [Partially Ordered]&lt;/td&gt;&lt;td&gt;, [Lost]&lt;/td&gt;&lt;td&gt;, [Not Pursued]&lt;/td&gt;&lt;td&gt;, [Expired (Past 90 days)]&lt;/td&gt;&lt;td&gt;, [Pending]&lt;/td&gt;&lt;td&gt; [Reasons_Code]&lt;/td&gt;&lt;td&gt;, [Open]&lt;/td&gt;&lt;td&gt;, [Ordered]&lt;/td&gt;&lt;td&gt;, [Partially Ordered]&lt;/td&gt;&lt;td&gt;, [Lost]&lt;/td&gt;&lt;td&gt;, [Not Pursued]&lt;/td&gt;&lt;td&gt;, [Expired (Past 90 days)]&lt;/td&gt;&lt;td&gt;, [Pending]&lt;/td&gt;&lt;td&gt; [Reasons_Code]&lt;/td&gt;&lt;td&gt;, [Open]&lt;/td&gt;&lt;td&gt;, [Ordered]&lt;/td&gt;&lt;td&gt;, [Partially Ordered]&lt;/td&gt;&lt;td&gt;, [Lost]&lt;/td&gt;&lt;td&gt;, [Not Pursued]&lt;/td&gt;&lt;td&gt;, [Expired (Past 90 days)]&lt;/td&gt;&lt;td&gt;, [Pending]&lt;/td&gt;&lt;td&gt; [Reasons_Code]&lt;/td&gt;&lt;td&gt;, [Open]&lt;/td&gt;&lt;td&gt;, [Ordered]&lt;/td&gt;&lt;td&gt;, [Partially Ordered]&lt;/td&gt;&lt;td&gt;, [Lost]&lt;/td&gt;&lt;td&gt;, [Not Pursued]&lt;/td&gt;&lt;td&gt;, [Expired (Past 90 days)]&lt;/td&gt;&lt;td&gt;, [Pending]&lt;/td&gt;&lt;td&gt; [Reasons_Code]&lt;/td&gt;&lt;td&gt;, [Open]&lt;/td&gt;&lt;td&gt;, [Ordered]&lt;/td&gt;&lt;td&gt;, [Partially Ordered]&lt;/td&gt;&lt;td&gt;, [Lost]&lt;/td&gt;&lt;td&gt;, [Not Pursued]&lt;/td&gt;&lt;td&gt;, [Expired (Past 90 days)]&lt;/td&gt;&lt;td&gt;, [Pending]&lt;/td&gt;

如何让它显示例如 &lt;td&gt; [Reasons_Code] &lt;/td&gt; 而不是 &amp;lt;td&amp;gt; [Reasons_Code]&amp;lt;/td&amp;gt

【问题讨论】:

  • 您不应该通过字符串连接来构建 XML!使用CURSOR 也是应该避免的。您的代码显示了程序性思维,而人们应该考虑基于集合。显然,当您尝试建立 HTML 表时,您可能会读到:stackoverflow.com/q/7086393/5089204。阅读较年轻的答案(尤其是我的:-))以找到更好的方法...
  • 这正是我所追求的,非常感谢!
  • 好吧,将其作为重复项关闭比较合适...编码愉快!

标签: html sql-server xml tsql concatenation


【解决方案1】:

通过堆叠for xml 语句,您是在告诉 SQL Server 您希望在 XML 字符串中保存包含保留 XML 字符的 ,例如:

<ActualTag>Your values that contain a < and > special character</ActualTag>

这显然是不可能的。仅仅因为您使用技巧来删除本来会出现的标签,您仍然在处理 XML values

要么改变你的字符串构建方法,要么只是 select value 保存在你的最终 XML 变量中:

declare @x xml = '<ActualTag>Your values that contain a &lt; and &gt; special character</ActualTag>';
select @x.value('.','nvarchar(max)')

输出:

Your values that contain a < and > special character

【讨论】:

  • 老实说:XML 根本不应该在字符串级别创建......在这种情况下 - 至少我认为是这样 - 最接近的提示可能是 SELECT CAST(@SomeStringThatLooksLikeXML AS XML),可能是 OP 正在寻找对于, TYPE 与您建议的.value() - 提示。但整个方法是错误的......
  • @Shnugo 哦,当然,同意所有观点。
猜你喜欢
  • 2021-09-05
  • 2023-03-11
  • 1970-01-01
  • 2013-03-01
  • 2017-09-29
  • 1970-01-01
  • 2012-02-21
  • 1970-01-01
  • 2018-05-07
相关资源
最近更新 更多