在Snowflake存储过程中使用SYSTEM$SEND_EMAIL发送多行表格数据问题
解决方案:将Snowflake查询结果转为美观的HTML表格邮件正文
要解决LISTAGG拼接导致的格式混乱问题,核心是利用SYSTEM$SEND_EMAIL支持HTML格式邮件的特性,把查询结果构造为HTML表格而非纯文本字符串。以下是调整后的存储过程:
修改后的存储过程代码
CREATE OR REPLACE PROCEDURE SP_SEND_EMAIL(integration_name VARCHAR, email_address_1 VARCHAR, SUBJECT VARCHAR) RETURNS VARCHAR LANGUAGE SQL AS $$ DECLARE Body VARCHAR; BEGIN -- 构造HTML格式的邮件正文:生成包含表头和数据行的表格 SELECT CONCAT( '<html><body>', '<table border="1" cellpadding="4" cellspacing="0" style="border-collapse: collapse;">', -- 表头部分:替换为你的9列实际名称 '<tr><th>客户名称</th><th>平台</th><th>差异百分比</th><th>统计日期</th><th>列5</th><th>列6</th><th>列7</th><th>列8</th><th>列9</th></tr>', -- 数据行部分:逐行拼接HTML行标签,处理不同数据类型 STRING_AGG( CONCAT( '<tr>', '<td>', COALESCE(Clientname, ''), '</td>', '<td>', COALESCE(Platform, ''), '</td>', '<td>', COALESCE(percentage_diff, 0), '% Difference</td>', '<td>', TO_CHAR(stat_date, 'YYYY-MM-DD HH24:MI:SS'), '</td>', -- 日期类型转格式化字符串 '<td>', COALESCE(varchar_col, ''), '</td>', '<td>', COALESCE(int_col, 0), '</td>', '<td>', COALESCE(col7, ''), '</td>', '<td>', COALESCE(col8, ''), '</td>', '<td>', COALESCE(col9, ''), '</td>', '</tr>' ), '' -- 行之间无分隔符 ), '</table>', '</body></html>' ) INTO Body FROM Nick_Alerting.Games_Spins_Degraded; -- 直接调用SYSTEM$SEND_EMAIL,修正原代码的语法错误 CALL SYSTEM$SEND_EMAIL(:integration_name, :email_address_1, :SUBJECT, :Body); RETURN 'Email Sent Successfully'; END; $$ ;
关键调整说明
- HTML结构化表格:用
<table>、<tr>、<th>、<td>标签构建规整表格,添加边框、内边距样式提升可读性,避免纯文本的杂乱排版 - 数据类型适配:
- 日期类型通过
TO_CHAR转换为易读的字符串格式 - 空值用
COALESCE替换为默认值(空字符串或0),避免邮件中显示NULL
- 日期类型通过
- 语法修正:原代码中
SendEmailSQL := (CALL ...)的写法错误,直接调用SYSTEM$SEND_EMAIL即可,无需额外通过EXECUTE IMMEDIATE执行
使用注意事项
- 确保你的Snowflake邮件集成支持HTML格式(主流邮件服务默认支持)
- 替换代码中的表头和列名,完全匹配
Games_Spins_Degraded表的9列实际名称与数据类型 - 若数据量极大,可通过设置
MAX_STRING_SIZE = UNLIMITED调整STRING_AGG的长度限制
内容的提问来源于stack exchange,提问作者NRY
相关产品推荐
相关产品推荐

