如何在sp_send_dbmail的附件文件名中使用正斜杠/字符?
问题根因
你遇到的问题本质和SQL转义无关,半角正斜杠/本身就是Windows、Linux等绝大多数操作系统的路径分隔符,属于文件名禁止使用的特殊字符。当你把带/的字符串传给sp_send_dbmail作为附件名时,系统会自动将/识别为目录层级的分隔符,截断前面的内容当成目录路径,只保留最后一段作为实际文件名,这就是你最终只得到2021.csv的原因。
同时你之前尝试的写法报错,是因为错误使用了单引号转义规则:只有在动态SQL的字符串内部需要转义单引号时才写两个单引号,普通字符串拼接时直接写N'/'即可,多写的单引号会被SQL解析为字符串结束,后面的/就被识别为除法运算符,自然触发类型不匹配的报错。
解决方案
方案1:替换为合法的分隔符(最稳妥)
推荐使用操作系统允许的分隔符替代半角/,常用的可选符号有:
- 短横
-,生成效果如SITLAMonthlyEntityReport 9-2021.csv - 下划线
_,生成效果如SITLAMonthlyEntityReport 9_2021.csv - Unicode全角正斜杠
/,视觉上和半角/几乎一致,且不会被识别为路径分隔符,生成效果完全符合你的预期SITLAMonthlyEntityReport 9/2021.csv
修改后的代码示例:
SELECT @query_attachment_filename = N'SITLAMonthlyEntityReport' +N' ' +CAST(DATEPART(MONTH, DATEADD(MONTH, -1, GETDATE())) AS NVARCHAR(12)) +N'/' -- 替换为全角正斜杠,也可换成'-'、'_'等其他合法符号 +CAST(YEAR(GETDATE()) AS NVARCHAR(4)) +N'.csv';
方案2:调整日期格式(更通用)
也可以直接把日期改成YYYYMM的数字格式,比如SITLAMonthlyEntityReport 202109.csv,这种格式没有任何特殊字符,跨系统兼容性最好,后期按文件名排序也更方便。
代码示例:
SELECT @query_attachment_filename = N'SITLAMonthlyEntityReport' +N' ' +FORMAT(DATEADD(MONTH, -1, GETDATE()), 'yyyyMM') -- 直接生成202109格式的上月年月 +N'.csv';
注意:半角
/无论怎么转义都无法出现在最终的文件名中,操作系统的文件名规则限制无法通过修改SQL语句绕过。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

