问题描述
我正在尝试在通过 sql Server 中的存储过程生成的报告电子邮件上添加 CSS。该功能正在运行,只是当我在电子邮件中收到它时,状态上的 CSS 显示如下:
这就是我为 CSS 编码所做的:
DECLARE @xml NVARCHAR(MAX);
DECLARE @html NVARCHAR(MAX);
SET @xml = CAST((
SELECT
TransactionTable.RequestName as 'td',CASE WHEN TransactionTable.Approved = 0 THEN '<p style="font-weight:bold;color: rgb(209,168,35);">PENDING</p>'
WHEN TransactionTable.Approved = NULL THEN '<p style="font-weight:bold;color: rgb(209,35);">PENDING</p>'
WHEN TransactionTable.Approved = 1 THEN '<p style="font-weight:bold;color: rgb(35,209,35);">APPROVED</p>'
WHEN TransactionTable.Approved = 2 THEN '<p style="font-weight:bold;color: rgb(228,26,26);">REJECTED</p>'
ELSE
'<p style="color: rgb(209,35);">PENDING</p>'
END as 'td',TransactionTable.Comments as 'td',CONVERT(VARCHAR(20),TransactionTable.ApprovedDate,100) as 'td',from
TransactionTable
ORDER BY ApproverOrder FOR XML PATH('tr'),ELEMENTS XSINIL) AS NVARCHAR(MAX));
SET @html = '<html>
<head>
<link href="https://fonts.googleapis.com/css2?family=Baloo+2&display=swap" rel="stylesheet">
<style>
body {font-family:''Baloo 2'';}
</style>
<Meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<Meta name="viewport" content="width=device-width,initial-scale=1.0"/>
</head>
<body>
<table>
<tr>
<td>Request Name</td>
<td>Status</td>
<td>Comment</td>
<td>Update On</td>
</tr>
<tr>
'+ @xml +'
</tr>
</table>
</body>
</html>';
EXEC msdb.dbo.sp_send_dbmail
@importance='normal',@FROM_address='noreply@mail.com',@body = @html,@body_format ='HTML',@recipients = 'myemail@mail.com',@subject = 'ApprovalReport' ;
在运行 sp_send_dbmail
之前,我需要做些什么才能使 CSS 正常工作?
解决方法
FOR XML PATH
的输出没有产生您期望的结果。如果你把它简化为一个最小的例子,这就是你正在做的代码:
DECLARE @xml NVARCHAR(MAX);
SET @xml = CAST((
SELECT
CASE WHEN Approved = 0 THEN '<p style="font-weight:bold;color: rgb(209,168,35);">PENDING</p>'
WHEN Approved = NULL THEN '<p style="font-weight:bold;color: rgb(209,35);">PENDING</p>'
WHEN Approved = 1 THEN '<p style="font-weight:bold;color: rgb(35,209,35);">APPROVED</p>'
WHEN Approved = 2 THEN '<p style="font-weight:bold;color: rgb(228,26,26);">REJECTED</p>'
ELSE
'<p style="color: rgb(209,35);">PENDING</p>'
END as 'td'
from (values (1,1)) T(ApproverOrder,Approved)
ORDER BY ApproverOrder FOR XML PATH('tr'),ELEMENTS XSINIL) AS NVARCHAR(MAX));
select @xml;
产生:
<tr xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><td><p style="font-weight:bold;color: rgb(35,35);">APPROVED</p></td></tr>
请注意 <
标签周围的 >
和 p
字符是如何编码为 <
和 >
序列的。尝试重新排列您的代码,使其更像以下内容:
DECLARE @xml NVARCHAR(MAX);
SET @xml = CAST((
SELECT
CASE
WHEN Approved = 0 THEN 'font-weight:bold;color: rgb(209,35);'
WHEN Approved = NULL THEN 'font-weight:bold;color: rgb(209,35);'
WHEN Approved = 1 THEN 'font-weight:bold;color: rgb(35,35);'
WHEN Approved = 2 THEN 'font-weight:bold;color: rgb(228,26);'
ELSE 'color: rgb(209,35);'
END as 'td/p/@style',CASE
WHEN Approved = 0 THEN 'PENDING'
WHEN Approved = NULL THEN 'PENDING'
WHEN Approved = 1 THEN 'APPROVED'
WHEN Approved = 2 THEN 'REJECTED'
ELSE 'PENDING'
END as 'td/p'
from (values (1,ELEMENTS XSINIL) AS NVARCHAR(MAX));
select @xml;
产生输出:
<tr xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><td><p style="font-weight:bold;color: rgb(35,35);">APPROVED</p></td></tr>