【发布时间】:2018-05-04 21:01:49
【问题描述】:
我正在尝试编写一个存储过程,它将 SQL 查询的结果转换为 HTML 字符串,然后将它们显示在 HTML 表中。
我遇到的问题是我正在使用 FOR XML 获取一个逗号分隔的 td 值列表,然后尝试连接它,但是当我这样做时,它会丢失 < 和 > 字符并替换他们使用 XML &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
但是,这就是它返回的内容:
<td> [Reasons_Code]</td><td>, [Open]</td><td>, [Ordered]</td><td>, [Partially Ordered]</td><td>, [Lost]</td><td>, [Not Pursued]</td><td>, [Expired (Past 90 days)]</td><td>, [Pending]</td><td> [Reasons_Code]</td><td>, [Open]</td><td>, [Ordered]</td><td>, [Partially Ordered]</td><td>, [Lost]</td><td>, [Not Pursued]</td><td>, [Expired (Past 90 days)]</td><td>, [Pending]</td><td> [Reasons_Code]</td><td>, [Open]</td><td>, [Ordered]</td><td>, [Partially Ordered]</td><td>, [Lost]</td><td>, [Not Pursued]</td><td>, [Expired (Past 90 days)]</td><td>, [Pending]</td><td> [Reasons_Code]</td><td>, [Open]</td><td>, [Ordered]</td><td>, [Partially Ordered]</td><td>, [Lost]</td><td>, [Not Pursued]</td><td>, [Expired (Past 90 days)]</td><td>, [Pending]</td><td> [Reasons_Code]</td><td>, [Open]</td><td>, [Ordered]</td><td>, [Partially Ordered]</td><td>, [Lost]</td><td>, [Not Pursued]</td><td>, [Expired (Past 90 days)]</td><td>, [Pending]</td><td> [Reasons_Code]</td><td>, [Open]</td><td>, [Ordered]</td><td>, [Partially Ordered]</td><td>, [Lost]</td><td>, [Not Pursued]</td><td>, [Expired (Past 90 days)]</td><td>, [Pending]</td><td> [Reasons_Code]</td><td>, [Open]</td><td>, [Ordered]</td><td>, [Partially Ordered]</td><td>, [Lost]</td><td>, [Not Pursued]</td><td>, [Expired (Past 90 days)]</td><td>, [Pending]</td><td> [Reasons_Code]</td><td>, [Open]</td><td>, [Ordered]</td><td>, [Partially Ordered]</td><td>, [Lost]</td><td>, [Not Pursued]</td><td>, [Expired (Past 90 days)]</td><td>, [Pending]</td>
如何让它显示例如 <td> [Reasons_Code] </td> 而不是 &lt;td&gt; [Reasons_Code]&lt;/td&gt
【问题讨论】:
-
您不应该通过字符串连接来构建 XML!使用
CURSOR也是应该避免的。您的代码显示了程序性思维,而人们应该考虑基于集合。显然,当您尝试建立HTML表时,您可能会读到:stackoverflow.com/q/7086393/5089204。阅读较年轻的答案(尤其是我的:-))以找到更好的方法... -
这正是我所追求的,非常感谢!
-
好吧,将其作为重复项关闭比较合适...编码愉快!
标签: html sql-server xml tsql concatenation