我目前正在创建一个SQL Server作业,如果表中有新信息,它将每隔x分钟发送电子邮件。这些电子邮件包含桌子上的信息,以及一个超链接到我们的一个网站。我试图嵌入超链接,这样更容易看到,但问题是,链接需要是动态的。(url.com/thing/(data from a table))
这是目前为止我写的最重要的代码
SET @tableHTML =
N'
<body>
<H3>table header</H3>
</body>
<table class="tg">
<table border="1">
<th>Link column header</th>' +
CAST((Select
td = '<a href="url.com/'+CAST(t.id AS varchar)+'">embedded link</a>'
from (
select
distinct
tn.id as id
from database.tableName as tn
where
tn.id is not null
) as t
FOR XML PATH('tr'), TYPE
) AS NVARCHAR(MAX) ) +
N'</table>' ;
和发送邮件的方法:
EXEC msdb.dbo.sp_send_dbmail
@recipients= @listOfRecipients,
@subject = @emailSubject,
@body = @tableHTML,
@body_format = 'HTML' ;
使用我现有的代码,我在发送的电子邮件中得到'<a href="url.com/t.id">embedded link</a>'
的输出,而不是我的目标:'嵌入式链接'
过去有人在这方面运气好吗?
问题是td
只是一个字符串,所以它被放在引号""
内。您可以将其强制转换为xml
,但是仅仅正确地生成XML节点要容易得多。
SET @tableHTML = N'
<body>
<H3>table header</H3>
</body>
<table class="tg">
<table border="1">
<th>Link column header</th>' +
(SELECT
[td/a/@href] = CONCAT('url.com/', t.id)
[td/a/text()] = 'embedded link'
FROM database.tableName as tn
WHERE tn.id IS NOT NULL
GROUP BY
tn.id
FOR XML PATH('tr')
) +
N'
</table>
</table>
';
如果你使用CONCAT
,也没有必要强制转换int
,如果你删除, TYPE
,那么你也不需要强制转换xml
,因为它只返回nvarchar
。