SSIS包配置咨询:按HOD分发打印统计邮件及CSV附件
SSIS包配置咨询:按HOD分发打印统计邮件及CSV附件
嗨,针对你这个按HOD分发打印统计邮件的需求,我给你梳理一套清晰的SSIS配置步骤,亲测好用:
一、前期准备
首先确保你的SSIS环境已经配置好SMTP连接管理器(用来发邮件),还有OLE DB连接管理器连接到你的业务数据库。另外提前创建一个用来存放CSV文件的文件夹(比如C:\Print_Reports),并给SSIS服务账户配置读写权限。
二、核心流程设计
整个包的逻辑是:先获取所有HOD的唯一列表,然后循环处理每个HOD——生成对应的打印明细CSV、计算总打印量,最后发送带附件的个性化邮件。
1. 生成HOD唯一列表
- 添加一个执行SQL任务,命名为
获取HOD列表,SQL语句如下:
把结果集设置为「完整结果集」,然后在「结果集」选项卡中,将结果映射到一个对象类型的变量(比如SELECT DISTINCT HOD_ID, HOD_Name FROM 你的表名;User::HODList)。
2. 遍历每个HOD(Foreach循环容器)
- 添加一个Foreach循环容器,连接刚才的执行SQL任务。
- 配置循环容器为「Foreach ADO枚举器」,选择变量
User::HODList,然后在「变量映射」选项卡中,把HOD_ID和HOD_Name分别映射到两个变量(比如User::CurrentHODID、User::CurrentHODName),这样每次循环就能拿到当前处理的HOD信息。
3. 生成当前HOD的打印明细CSV
在Foreach循环容器内部,添加一个数据流任务,命名为生成HOD打印明细CSV:
- 数据流里拖一个OLE DB源,SQL语句写:
这里的SELECT Emp_Name, dateofprint, printout FROM 你的表名 WHERE HOD_ID = ?;?是参数,绑定到变量User::CurrentHODID。 - 拖一个平面文件目标,配置为CSV格式,文件路径用变量动态生成(比如
User::CSVFilePath,表达式设为:"C:\\Print_Reports\\HOD_"+(DT_WSTR,10)@[User::CurrentHODID]+"_"+REPLACE((DT_WSTR,20)GETDATE(),":","_")+".csv"),这样每个HOD的CSV都有唯一文件名,避免覆盖。 - 配置平面文件目标的列映射,确保源表列和CSV列对应正确。
4. 计算当前HOD的打印总量
在Foreach循环容器内部,添加另一个执行SQL任务,命名为计算HOD打印总量,SQL语句如下:
SELECT SUM(printout) AS TotalPrint FROM 你的表名 WHERE HOD_ID = ?;
参数绑定User::CurrentHODID,结果集设为「单行结果集」,把TotalPrint映射到一个整数类型的变量User::TotalPrintCount。
5. 发送邮件给当前HOD
在Foreach循环容器内部,添加一个发送邮件任务,命名为发送邮件给HOD:
- 配置邮件连接管理器为之前设置的SMTP连接。
- 邮件主题用表达式动态生成:
"[" + @[User::CurrentHODName] + "] 今日打印统计报告" - 邮件正文也用表达式插入个性化内容,示例:
"尊敬的" + @[User::CurrentHODName] + ": 您好!以下是您下属员工今日的打印统计: 总打印量:" + (DT_WSTR,10)@[User::TotalPrintCount] + " 份 详细明细请查看附件。 此致 打印统计系统" - 在「附件」选项卡中,添加变量
User::CSVFilePath,把生成的CSV作为附件发送。 - (进阶优化)如果你的HOD邮箱地址存在表中,可以在第一步获取HOD列表时把邮箱字段也查出来,映射到变量
User::CurrentHODMail,然后邮件收件人用这个变量动态设置,更灵活。
三、额外注意事项
- 测试时可以先手动执行单个HOD的流程,确认CSV生成和邮件发送都正常,再跑完整循环。
- 如果需要按日期筛选(比如只发送当天的打印数据),可以在所有SQL语句中加上
AND dateofprint = CAST(GETDATE() AS DATE)的条件,或者用变量传递日期参数,方便后续调度。
备注:内容来源于stack exchange,提问作者shyam chauhan
相关产品推荐
相关产品推荐

