1

我的 SSIS 包中有发送数据库电子邮件的 SQL 任务。

EXEC sp_send_dbmail @profile_name='default',
@recipients='dev@null.com',
@subject=@SUB,
@body=@BODY,
@query= 'SELECT DISTINCT FileLoadName
FROM [dbo].[Table1] WHERE RowCDate >=@PackageStartTime',
@attach_query_result_as_file=1

但是@recipients 的值在这里是硬编码的。所以我有一个快速的想法。每次更改收件人姓名时,我都必须转到 SSIS 包并在那里应用更改。有没有其他方法可以做到这一点,比如将其作为变量并将其放入配置文件中;因此,如果值随时间变化,有人可以继续在配置文件中进行更改。

提前致谢。

4

3 回答 3

1

将其作为参数传递。一个这样的例子:https ://www.simple-talk.com/sql/ssis/passing-variables-to-and-from-an-ssis-task/

注意:我更喜欢在代码开头接收传递的变量。这样,即使我的代码结构发生变化,传递的参数顺序也不需要改变。

我没有触及您为查询设置的值,因为我不明白为什么您的参数 @PackageStartTime 在引号内。您也可以将附加标志作为参数传递。

一旦查询被参数化,相应的变量就可以放入配置中。

DECLARE 
    @p_profile_name AS VARCHAR(100) = ?,
    @p_receipients AS VARCHAR(MAX) = ?,
    @p_subject as VARCHAR(100) = ?,
    @p_body AS VARCHAR(MAX) = ?;

    EXEC sp_send_dbmail @profile_name= ?, --'default',
    @recipients= ?,                       --'dev@null.com',
    @subject= ?                           -- @SUB,
    @body= ?                              -- @BODY,
    @query= 'SELECT DISTINCT FileLoadName
            FROM [dbo].[Table1] WHERE RowCDate >=@PackageStartTime',
            @attach_query_result_as_file=1

请让我们(SSIS 开发人员的精力充沛的团队)知道它是否有效。

于 2013-03-09T01:41:25.787 回答
0

您还可以从这样的表格中获取收件人列表。假设您有一个名为 EmployeeList 的表,其中包含一个 EmailAddress 字段。

DECLARE @emails VARCHAR(500)
SET @emails = '' 
SELECT @emails = @emails + EmailAddress + ';' FROM EmployeeList 

DECLARE @recipList VARCHAR(500)
SET @recipList =  (select SUBSTRING(@emails, 0, LEN(@emails))) 

然后你可以像这样设置你的收件人列表

EXEC sp_send_dbmail @profile_name='default',
@recipients= @recipList,
@subject=@SUB,
etc....
于 2013-03-09T03:24:56.290 回答
0

Maina,我查看了您在与 questions/15351282 相关的页面上给出的代码。

  1. 一般性评论:考虑组件以及您希望分配给它们的责任。这是编写干净、可管理和高效的代码的一个非常重要的概念/实践。

  2. 现在有一些细节:在代码中,您正在执行一个 if 语句,然后决定是否应该发送电子邮件。把它分成两部分。在控制面上有第一个 Execute sql 任务。将结果存储在变量中。仅测试这一部分,并确保将正确数量的行存储在您的包变量中。对不起,如果我太细化了。

  3. 使用条件任务来决定是否应该执行此 sendEmail 任务。

  4. 先用一个简单的查询;删除 @attach_query_result_as_file 参数。

  5. 在此任务中添加另一个变量: DECLARE @p_PackageStartTime as varchar(40); @query = 'SELECT DISTINCT FileLoadName FROM [dbo].[Table1] WHERE RowCDate >= ' + @PackageStartTime
  6. 确保您以正确的顺序传递参数。如果仍然失败,请添加参数映射的屏幕截图。
于 2013-03-16T11:50:48.227 回答