由于拼接量过大,大概3万条数据,使用 XML PATH(‘tr’) 会中断,每次拼接到一千多行就断了,使用多个nvarchar (max)变量相加也无法解决。
有想过直接生成Excel以附件形式发送邮件,毕竟几万行的表格放在邮件里也是相当炸裂的,但是提议被否决,只能老实干下去。
后面看到用实体表 UpdateText的模式,就尝试了下,结果成功了。
参考:https://www.cnblogs.com/ilrc/p/5193166.html
这是表结构:
下面是拼接的sql:
TRUNCATE TABLE CONCAT_EmailBodytb --每次清空这个拼接的实体表
declare @Html varchar (max),@TableTr varchar (max), @i int,@rowcount int,@ptrval binary(16)
set @i=1
select @rowcount=count(*) from #SendEmailDatatb --获取要发送邮件的数据行数
IF @rowcount>0
BEGIN
set @Html =N'<html><head></head><body><h3>Dear All:</h3><h3> 以下为XXXXXXXXXX(共'+convert(varchar(10), @rowcount)+'项),请查收: </h3></br><h3>此邮件为系统发送,请勿回复!</h3><br/><table border="1" cellspacing="0"><thead><tr><th>序号</th><th>列1</th><th>列2</th></tr> </thead><tbody>'
INSERT INTO CONCAT_EmailBodytb (EmailBody)VALUES(@Html)--拼接邮件内容第一步
while @i<=@rowcount
begin
SELECT @TableTr ='<tr><td>'+convert(varchar(10), ID)+'</td><td>'+COL1+'</td><td>'+COL2+'</td></tr>' from #SendEmailDatatb where ID=@i --ID是自定义的列ROW_NUMBER()
--循环拼接每一行
SELECT @ptrval = TEXTPTR(EmailBody) from CONCAT_EmailBodytb
UPDATETEXT CONCAT_EmailBodytb.EmailBody @ptrval NULL 0 @TableTr
set @i=@i+1
end
--拼接内容结束
SELECT @ptrval = TEXTPTR(EmailBody) from CONCAT_EmailBodytb
UPDATETEXT CONCAT_EmailBodytb.EmailBody @ptrval NULL 0 '</tbody></table></body></html>';
--获取拼接好的邮件内容
SELECT EmailBody FROM CONCAT_EmailBodytb WHERE id=1
END