如何使收件人地址动态,所以我可以避免在SSIS包中进行更改?

时间:2013-03-08 22:35:37

标签: sql-server ssis config

我的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包并在那里应用更改。有没有其他方法可以做到这一点,比如把它变成变量并把它放在配置文件中;因此,如果值随时间变化,有人可以继续在配置文件中进行更改。

提前致谢。

3 个答案:

答案 0 :(得分: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开发人员的精力充沛的团队)知道它是否有效。

答案 1 :(得分: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....

答案 2 :(得分:0)

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

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

  2. 现在有些细节:在代码内部执行if语句,然后决定是否应该发送电子邮件。将它分成两部分。在控制界面上有第一个执行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. 确保您按正确的顺序传递参数。 如果仍然失败,请添加参数映射的屏幕截图。