格式化来自 SQL Server 2008 的 HTML 电子邮件中的查询数据

Posted

技术标签:

【中文标题】格式化来自 SQL Server 2008 的 HTML 电子邮件中的查询数据【英文标题】:Formatting query data in HTML email from SQL Server 2008 【发布时间】:2016-05-19 17:15:19 【问题描述】:

我正在尝试让 SQL Server 2008 发送 html 格式的电子邮件,但是我在查询中提取的字段之一是“金钱”数据类型,因此在小数点后显示为 3 位,我可以'似乎没有显示美元符号。这是我目前所拥有的:

DECLARE @BodyText NVARCHAR(MAX);

SET @BodyText =
N'Please notify the attorney of the direct pay(s) shown below:<BR><BR>' +
N'<table border="1">' +
N'<tr><th>File</th><th>Name</th><th>Balance</th><th>Atty File</th>' +
CAST ( ( SELECT td = number,    '',
                td = Name,  '',
                td = '$'+ROUND(current1,2), '',
                td = CC.AttorneyAccountID,  ''
from master 
    inner join CourtCases CC on master.number = CC.AccountID
where number = 1234567
          FOR XML PATH('tr'), TYPE 
) AS NVARCHAR(MAX) ) +
N'</table>' ;


--Notify legal team of legal DPs
exec msdb.dbo.sp_send_dbmail 
@profile_name = 'Default'
, @recipients = 'me@mycompany.com'
, @subject = 'test html email'
, @Body = @BodyText
, @body_format = 'HTML';

问题在于主表中的“current1”字段。即使使用上面的代码,该字段仍显示为“50.000”。

如果我必须将 Cast 作为 NVarchar 才能使用动态 SQL,如何使该字段在最终电子邮件中显示为“$50.00”?

提前致谢!!

【问题讨论】:

像这样投到decimal - td = '$'+CAST(CAST(current1 AS DECIMAL(10, 2)) AS VARCHAR) 【参考方案1】:

SQL Server 2012 及更高版本,您可以使用FORMAT 函数获取带有货币符号的值。在你的情况下是这样的

SELECT 
    ...
    td = FORMAT(current1, 'C', 'en-us')
FROM
    ...

对于 SQL Server 2008,您可以像这样实现它 -

SELECT 
    ...
    td = '$'+CAST(CAST(current1 AS DECIMAL(10, 2)) AS VARCHAR)
FROM
    ...

【讨论】:

【参考方案2】:

请不要使用td = '$'+ROUND(current1,2), '', 这一行,而是使用以下行,它将解决您的问题。

td = CONCAT('$', ROUND(current1, 2)), '',

@current1 作为Money 数据类型的sys.objects 表执行示例。

DECLARE @BodyText NVARCHAR(MAX);
DECLARE @current1 AS Money = '50.000';

SET @BodyText =
N'Please notify the attorney of the direct pay(s) shown below:<BR><BR>' +
N'<table border="1">' +
N'<tr><th>File</th><th>Name</th><th>Balance</th><th>Atty File</th>' +
CAST ( ( SELECT td = [type_desc],    '',
                td = Name,  '',
                td = CONCAT('$', ROUND(@current1, 2)), '',
                td = [type],  ''
          FROM SYS.objects 
          WHERE [type] = 'U' 
          FOR XML PATH('tr'), TYPE 
) AS NVARCHAR(MAX) ) +
N'</table>' ;

--PRINT @BodyText

【讨论】:

【参考方案3】:

您的想法是正确的,但有两个警告:值舍入与格式化和字符串+浮点问题。

Round() 接受一个数值表达式并使用 length 参数来确定 numeric_expression 被舍入到的精度。

值是四舍五入的,但格式不是。

例如:

ROUND(current1 , -1) = 50.000

您的值有 3 位小数。如果您希望反映不同的小数位数,您必须将您的值转换为具有该长度的小数,即

CAST(current1 AS DECIMAL(10, 2)) = 50.00

现在是字符串连接的地方。这个值仍然是一个浮点数,你不能与一个字符串组合。这是您需要转换为 Varchar 并与 '$' 连接的地方

'$'+CAST(CAST(current1 AS DECIMAL(10, 2)) AS VARCHAR) = $50.00

此解决方案适用于 Sql Server 2008。

链接:

SQL Fiddle examples

TOTN : ROUND

SO : Concat String and Float

【讨论】:

这正是我所需要的!非常感谢您的有益和教育性的回应。效果很好!!

以上是关于格式化来自 SQL Server 2008 的 HTML 电子邮件中的查询数据的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 NHibernate 处理来自 SQL Server 2008 的 TIME 数据类型?

SQL Server 2008 Windows 身份验证登录错误:登录来自不受信任的域

TSQL:如何将本地时间转换为 UTC? (SQL Server 2008)

在sql server2008中的日期类型是啥

如何让sqlserver 只返回年和月?

sql server 2008,SP_OACreate手动执行成功,代理作业定时执行失败?