sql-server - 无法将 <HTML> 标记写入 SQL Server 触发器中的文本文件

标签 sql-server t-sql triggers

我一直在解决供应商设置的限制,它要求我编写一个 SQL Server 触发器来填充一个文本文件,然后将其移动到邮件接收文件夹(如果供应商允许我直接从 SQL 发送电子邮件。

话虽如此,我可以写入文本文件并移动它们,但我似乎无法将 <html> 标签插入到文本文件中。

当我尝试时,它只是忽略了该行。有什么帮助吗?

SET @from = 'FROM: <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="3b555416495e4b57427b5f54565a5255555a565e15585456" rel="noreferrer noopener nofollow">[email protected]</a>' ;
set @to = 'TO: <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="fd9698948995bd9992909c9493939c9098d39e9290" rel="noreferrer noopener nofollow">[email protected]</a>';
SET @subject = @subjecttext
SET @cmd = '(echo '+@from+' && echo '+@to+' && echo ' +@subject+') >//server02-2010/test/SprintTask.txt';
EXEC master..xp_cmdshell @cmd, no_output;

--set @body = 'more text';
--SET @cmd = '(echo '+@body+') >>//server02-2010/test/SprintTask.txt';
--EXEC master..xp_cmdshell @cmd, no_output;

set @body = 'Content-Type: multipart/mixed;' 
SET @cmd = '(echo '+@body+') >>//server02-2010/test/SprintTask.txt';
EXEC master..xp_cmdshell @cmd, no_output;

Set @body = 'boundary="Attached"';
SET @cmd = '(echo '+@body+') >>//server02-2010/test/SprintTask.txt';
EXEC master..xp_cmdshell @cmd, no_output;

Set @body = '--Attached' ;
SET @cmd = '(echo '+@body+') >>//server02-2010/test/SprintTask.txt';
EXEC master..xp_cmdshell @cmd, no_output;

Set @body = 'Content-Type: text/html;charset=UTF-8' ;
SET @cmd = '(echo '+@body+') >>//server02-2010/test/SprintTask.txt';
EXEC master..xp_cmdshell @cmd, no_output;

Set @body = 'Content-Transfer-Encoding: 7bit' ;
SET @cmd = '(echo '+@body+') >>//server02-2010/test/SprintTask.txt';
EXEC master..xp_cmdshell @cmd, no_output;

Set @body = '--Attached--'
SET @cmd = '(echo '+@body+') >>//server02-2010/test/SprintTask.txt';
EXEC master..xp_cmdshell @cmd, no_output;

Set @body = '<b>' + 'THIS IS TEST TEXT';
SET @cmd = '(echo '+@body+') >>//server02-2010/test/SprintTask.txt';
EXEC master..xp_cmdshell @cmd, no_output;

最佳答案

触发器应该非常小而灵活,因为它在导致触发器触发的事务上下文中执行。

它绝对不应该进行任何繁重的工作和广泛的处理,例如写入外部文件......

我建议重新考虑您的触发策略 - 就您而言,我会

  • 编写一个触发器,将相关信息输出到单独的“PendingEmails”表(或类似的表)中 - 但仅此而已

  • 创建一个单独的程序(可以是 T-SQL 存储过程,或者用 C# 编写的前端应用程序或其他程序),然后按计划查询“PendingEmails”表,如果需要,实际上会发送您想要发送的电子邮件 - 在单独的进程中,而不是在同一数据库事务中

否则,您的触发器可能最终需要很长时间才能完成,特别是如果它可能需要等待外部源返回确认 - 而这种情况会发生在实际 SQL 语句的上下文 - 这是消除数据库可能具有的任何性能的可靠方法......

关于sql-server - 无法将 <HTML> 标记写入 SQL Server 触发器中的文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31681944/

相关文章:

sql - 将 sql_variant 转换为以 varchar 形式提供的 data_type

t-sql - 具有多个相似子查询的sproc的SQL优化

mysql - 尝试触发更新时出现错误 1442

sql-server - 什么是回写?

sql-server - MSSQL 插入 n 次,其中 n 来自一个选择

sql-server - 跨服务器管理身份/主 key

JSON_MODIFY 按索引在 json 数组中插入值

sql-server - 列出 SQL Server 临时表中的列名称

MySQL 触发器在现有行上导致未知系统变量错误

MySQL 触发器 - 将 SELECT 存储在变量中