32  
查询码: 00000131
SQL SERVER生成HTML Table - Jack He - 博客园
来源:https://www.cnblogs.com/hesijian/p/12559182.html
作者: 周杨 于 2023年03月23日 发布在分类 / 计算机应用 / 数据库 / SQLSERVER ,于 2023年03月23日 编辑

方法一

select 
 (select BraCode as 'td' for xml path(''), type),
 (select BraName as 'td' for xml path(''), type),
 (select BraPrefix as 'td' for xml path(''), type)
from Bra_Mst 
for xml path('tr')

 效果

<tr>
 <td>HKG</td>
 <td>Hong Kong</td>
 <td>HKG</td>
</tr>
<tr>
 <td>SHA</td>
 <td>Shanghai</td>
 <td>SHA</td>
</tr>

加上标题

select 
 (select 'Problem' as th for xml path(''), type),
 (select 'Onset'  as th for xml path(''), type),
 (select 'Status' as th for xml path(''), type)
union all     
select 
 (select p.ProblemType   as 'td' for xml path(''), type),
 (select p.Onset      as 'td' for xml path(''), type),
 (select p.DiagnosisStatus as 'td' for xml path(''), type)
from tblProblemList p
where p.PatientUnitNumber = @PatientUnitNumber
for xml path('tr')

————————————————————————————————————————————————————

方法二(推荐)

https://www.codenong.com/7086393/

与其使用FOR XML PATH('tr'),不使用FOR XML RAW('tr'),ELEMENTS。这将防止将值连接在一起,并提供非常干净的输出,查询如下所示:

SELECT  p.ProblemType AS td,
        p.Onset AS td,
        p.DiagnosisStatus AS td
FROM    tblProblemList p
WHERE   p.PatientUnitNumber = @PatientUnitNumber
FOR XML RAW('tr'), ELEMENTS
用纯标记附加标题行,这样可以更好地控制正在发生的事情。完整的代码块如下所示:
DECLARE @body NVARCHAR(MAX)
SET     @body = N'<table>'
    + N'<tr><th>Problem</th><th>Onset</th><th>Status</th></tr>'
    + CAST((
        SELECT  p.ProblemType AS td,
                p.Onset AS td,
                p.DiagnosisStatus AS td
        FROM    tblProblemList p
        WHERE   p.PatientUnitNumber = @PatientUnitNumber
        FOR XML RAW('tr'), ELEMENTS
    ) AS NVARCHAR(MAX))
    + N'</table>'
想根据格式化输出表的需要增加一些额外的价值。" AS td"别名将在标记中生成value元素,但这不是因为它知道表单元格是td。这种断开连接使我们可以创建伪造的HTML元素,这些元素可以在查询执行后稍后进行更新。例如,如果我想使ProblemType值居中对齐,则可以调整元素名称以允许这样做。我不能在元素名称中添加样式或类,因为它破坏了SQL中的别名命名约定,但是我可以创建一个新的元素名称,例如tdc。这将产生value元素。尽管这在任何情况下都不是有效的标记,但是replace语句很容易处理。
DECLARE @body NVARCHAR(MAX)
SET     @body = N'<table>'
    + N'<tr><th>Problem</th><th>Onset</th><th>Status</th></tr>'
    + CAST((
        SELECT  p.ProblemType AS tdc,
                p.Onset AS td,
                p.DiagnosisStatus AS td
        FROM    tblProblemList p
        WHERE   p.PatientUnitNumber = @PatientUnitNumber
        FOR XML RAW('tr'), ELEMENTS
    ) AS NVARCHAR(MAX))
    + N'</table>'

SET @body = REPLACE(@body, '<tdc>', '<td class="center">')
SET @body = REPLACE(@body, '</tdc>', '</td>')

这将创建格式为value的单元格元素。在字符串的顶部有一个快速块,您将可以通过简单的调整来使中心对齐的值。

我需要解决的另一种情况是在标记中包含链接。只要单元格中的值就是您在href中所需的值,就很容易解决。我将扩展示例,使其包含一个我希望链接到详细URL的ID字段。


DECLARE @body NVARCHAR(MAX)
SET     @body = N'<table>'
    + N'<tr><th>Problem</th><th>Onset</th><th>Status</th></tr>'
    + CAST((
        SELECT  p.ID as tda
                p.ProblemType AS td,
                p.Onset AS td,
                p.DiagnosisStatus AS td
        FROM    tblProblemList p
        WHERE   p.PatientUnitNumber = @PatientUnitNumber
        FOR XML RAW('tr'), ELEMENTS
    ) AS NVARCHAR(MAX))
    + N'</table>'

SET @body = REPLACE(@body, '<tda>', '<td><a href="http://mylinkgoeshere.com/id/')
SET @body = REPLACE(@body, '</tda>', '">click-me</td>')
此示例未考虑使用链接文本内部单元格中的值,但这是一些CHARINDEX工作可解决的问题。
该系统的最终实现是基于SQL查询发送HTML电子邮件。我反复需要单元格对齐和公共链接类型,因此我将替换函数移到了SQL中的共享标量函数中,因此不必在发送电子邮件的所有存储过程中都使用它们。




 历史版本

备注 修改日期 修改人
其他原因...增加方法二 2023-03-23 13:54:06[当前版本] 系统管理员
CREAT 2023-03-23 11:45:05 系统管理员

  目录
    知识分享平台 -V 5.1.4 -大信谛威