我有一段代码想要在存储过程中反复使用。此代码块会将许多变量设置为空白 (
''
)。我想这样做,而不必每次都复制/粘贴整个代码。
长话短说,我正在使用一个存储过程来发送许多具有各种表格和格式等的独特电子邮件。
我通过在存储过程的开头声明这些变量来完成此操作:
/* declare HTML variables */
declare @htmlSTART nvarchar(max), @htmlEND nvarchar(max), @body nvarchar(max), @greeting nvarchar(max), @closing nvarchar(max), @subject nvarchar(max)
declare @recipients nvarchar(max), @profile_name nvarchar(max), @body_format nvarchar(max), @copy_recipients nvarchar(max), @blind_copy_recipients nvarchar(max)
declare @table_header_01 nvarchar(max), @paragragh_01 nvarchar(max), @HTML_table_01 nvarchar(MAX), @disclaimer_01 nvarchar(max)
declare @table_header_02 nvarchar(max), @paragragh_02 nvarchar(max), @HTML_table_02 nvarchar(MAX), @disclaimer_02 nvarchar(max)
declare @table_header_03 nvarchar(max), @paragragh_03 nvarchar(max), @HTML_table_03 nvarchar(MAX), @disclaimer_03 nvarchar(max)
declare @table_header_04 nvarchar(max), @paragragh_04 nvarchar(max), @HTML_table_04 nvarchar(MAX), @disclaimer_04 nvarchar(max)
然后,存储过程会查询一堆数据,为电子邮件创建一个临时主数据表,使用游标递归地提取每个唯一的电子邮件地址,使用 html 创建表格,然后通过电子邮件发送相关数据,如下所示:
set @body =
concat
(
@htmlSTART
, @greeting
, @paragragh_01, @table_header_01, @HTML_table_01
, @paragragh_02, @table_header_02, @HTML_table_02
, @paragragh_03, @table_header_03, @HTML_table_03
, @paragragh_04, @table_header_04, @HTML_table_04
, @closing
, @disclaimer_01
, @htmlEND
)
EXEC msdb.dbo.sp_send_dbmail
@profile_name = @profile_name
, @body = @body
, @body_format = @body_format
, @recipients = @recipients
, @copy_recipients = @copy_recipients
, @blind_copy_recipients = @blind_copy_recipients
, @subject = @subject
在每个电子邮件部分的开头,我将变量设置为空白:
set @table_header_01 = '' set @paragragh_01 = '' set @HTML_table_01 = '' set @disclaimer_01 = ''
set @table_header_02 = '' set @paragragh_02 = '' set @HTML_table_02 = '' set @disclaimer_02 = ''
set @table_header_03 = '' set @paragragh_03 = '' set @HTML_table_03 = '' set @disclaimer_03 = ''
set @table_header_04 = '' set @paragragh_04 = '' set @HTML_table_04 = '' set @disclaimer_04 = ''
不必记住每封电子邮件要从
set @body =
中删除哪些表等,而是每次都会重置变量,因为有些电子邮件只包含一个表(或不包含),有些则包含多个表。如果 @html_table
变量为空,它不会弄乱电子邮件,但从 set @body =
中删除错误的变量会在我 EXEC msdb.dbo.sp_send_dbmail
时弄乱它。
我发现THIS线程讨论创建临时过程,我也尝试了动态SQL,但据我所知,动态SQL无法从外部范围设置变量。它抛出错误,指出变量
@HTML_table_01
等尚未声明。
有没有办法重复将所有变量设置为
''
,而无需每次都复制/粘贴/键入?如果有一个好的方法,我确信除了我的特定用例之外,该方法还有很多其他应用程序。
可能使用goto
来实现肮脏的黑客 - 你可以拥有变量初始化部分并使用
goto
跳转到它,并使用另一个变量来存储值以确定然后跳回的位置到,但我永远不会认为这是生产代码的一个选项; T-Sql 不像典型的命令式语言 - 如果您需要重复变量赋值块,那就这样吧。可以考虑用
#tempTable
代替大量重复的相似局部变量,其中的列代表重复的变量。截断它并用 4(或任意多)行填充它以在每次使用时进行初始化
仅用一个 Id 来表示每个变量下标;作为临时表,您甚至可以将此初始化代码放入其自己的过程中,这样可以看到临时表。
然后,分配变量的代码只需更新行
n
的表,您就可以选择相关的列/行来构建最终字符串。