忙了一段,终于有时间来完成这一系列了。sql server 2008正式版已经发布了,接下来的系列都将基于sql server 2008+vs.net 2008开发。

引言
     在一个B2B项目中遇到这样的一个情况,每天老板都想看到所有的新的订单信息,而这个老板很懒,不想登录系统后台,而是想通过查看邮件的方式。当然实现方式很多,这里我们介绍一个怎么使用SSIS包来实现这样的一个功能。使用SQL  XML Query查询出XML结果数据,然后使用Xsl模板将xml数据转换成html,再将html内容发送邮件。

创建SSIS包

1.和vs.net 20005中一样的方式,创建一个Integration Service项目,并且包的名称修改为SendMailPackage
    2.在你的本地硬盘上新建一个目录,比如F:\SSIS_Example\SendMail  用来存放查询语句和Xsl文件.
    3.在刚才的目录下新建一个QueryOrder.sql文件,填充如下内容,在连接管理器中新建一个文件连接,选择新建的sql文件:

隐藏行号 复制代码 ? QueryOrder.sql
  1. /*
  2.    实际使用时将@v_CurrentDate换成当时日期
  3. */
  4. declare    @v_CurrentDate    datetime
  5. set    @v_CurrentDate =    '2003-07-17'
  6.  /*set    @v_CurrentDate  = GETDATE()*/
  7. if    exists    (select 1
  8.         from    Sales.SalesOrderHeader
  9.         where    OrderDate =    @v_CurrentDate)
  10. begin
  11.     select    top 10 oh.OrderDate, 
  12.         (select    round(sum(TotalDue), 2)
  13.         from    Sales.SalesOrderHeader
  14.         where    OrderDate =    @v_CurrentDate) as DayTotal,
  15.         p.ProductID, p.Name, 
  16.         round(sum(oh.TotalDue), 2) as ProductSubtotal
  17.     from    AdventureWorks.Sales.SalesOrderHeader    oh
  18.     join    AdventureWorks.Sales.SalesOrderDetail    od
  19.     on    od.SalesOrderID =    oh.SalesOrderID
  20.     join    AdventureWorks.Production.Product    p
  21.     on    p.ProductID =        od.ProductID
  22.     where    oh.OrderDate =    @v_CurrentDate    
  23.     group 
  24.     by    oh.OrderDate, p.ProductID, p.Name
  25.     order    
  26.     by    5 desc, p.ProductID asc 
  27.     for xml auto, elements, type, root('Order')
  28. end
  29. else    select cast('<NoRecords>No sales records available for this date.</NoRecords>' as xml)
  30.     

注:  在这里我们使用一个固定的日期,实际中你可以使用系统方法GETDATE()或者DATEDIFF()来查询你需要的日期。

4.同样在目录下面新建一个Orders.xsl文件,由于内容较多,请直接下载附件中文件,这里也不在详细介绍xsl的具体内容。 同样也新建一个文件连接。
   5.在目录下新建一个Orders.htm文件,用来存放生成的html内容,同时也新建一个文件连接。
   6.新建一个Ado.net 连接你的AdventureWorks数据库。现在你的连接管理器有如下连接:


   7.创建如下几个变量,作用域为当前包SendMailPackage.

名称 数据类型
varSalesSummaryXML String  
varSalesSummaryHTML String  
varMailTo String 你的接收Email地址

8.在你的控制流中添加一个执行SQL任务,并设置sql类型为文件的方式,并选择我们的文件连接:

9.切换到结果集,点击添加,结果果名称为0,变量选择varSalesSummaryXML

10.在控制流中添加一个XML任务,将刚才的SQL任务的绿箭头指向XML任务,设置属性如下:
 

为了测试结果,上面我们将输入结果设置为保存文件的方式,先执行一下包,测试一下采用xml+xslt的方式生成的html的内容是否正确:

注意,现在我们再把输出结果改为变量的方式,设置DestinationType属性为变量的方式,并选择varSalesSummaryHTML

11. 在XML任务下面添加一个脚本任务来执行发送邮件,之所以不直接采用SSIS的发送邮件任务,是因为发送邮件任务目前不支持html内容.进行脚本任务的属性设置:
 

可以看到,脚本任务的设置相对于2005的版本发生比较大的变化,脚本语言终于开始支持了C#,原来的PreCompileScriptIntoBinaryCode属性不存在了,所有的脚本都要进行预编译,另外ReadOnlyVariables和ReadWriteVariables变量的设置都可以通过后面的选择对话框直接选择。这些改进方便了许多,设置完成后,我们点击编译脚本就可以起用用我们熟悉的C#来完成发送邮件的操作了.
      注意我们需要引入System.Net.Mail,然后通过SmtpClient来通过指定的邮件服务器发送邮件,可以指定邮件帐号和密码,而SSIS的发送邮件任务是不支持非windows论证的。

隐藏行号 复制代码 ? QueryOrder.sql
  1. public void Main()
  2. {
  3.       SmtpClient  smtpClient = new SmtpClient("邮件服务器地址",25);
  4.       string body =  Dts.Variables["varSalesSummaryHTML"].Value.ToString();
  5.       string address =  Dts.Variables["varMailTo"].Value.ToString();
  6.       MailMessage mm = new MailMessage("发送地址",address, "Order Detail",body);
  7.       mm.IsBodyHtml = true;
  8.       smtpClient.Credentials = new System.Net.NetworkCredential("帐号","密码");
  9.       smtpClient.Send(mm);
  10.     
  11.     Dts.TaskResult = (int)ScriptResults.Success;
  12. }

12. 到现在为止已经完成了功能,直接执行包,就可以直接收到订单列表了,但是要想让这个包定期的执行,需要部署这个SSIS包,然后在数据库job中定义执行此包.右击当前的项目,设置CreateDeploymentUtility属性为True,这样能够自动生成部署文件.

重新编译此项目,在bin目录下面Deployment文件夹,双击下面的后缀名为SSISDeploymentManifest文件,启动包安装向导,在这里我们不详细介绍,直接下一步,直到完成.

13. 打开你的SSMS,确认已经启动Sql Server代理,新建作业,步骤里面设置执行我们刚才的SSIS包,再把计划设置为你想要的时间即可,这里就不再详细介绍。
     

参考
    http://www.sqlservercentral.com/articles/Integration+Services+(SSIS)/62678/
项目下载
   http://files.cnblogs.com/lonely7345/SSISMailExample.rar

作者:孤独侠客(似水流年)
出处:http://lonely7345.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

分类: SQL Server
标签: SSIS, Send Mail, C# 脚本
本文转自孤独侠客博客园博客,原文链接:http://www.cnblogs.com/lonely7345/archive/2009/09/03/1559579.html,如需转载请自行联系原作者

SQL Server BI Step by Step SSIS 5 --- 通过Email发送查询结果相关推荐

  1. SQL Server BI Step by Step SSRS 1-Reporting Service 2008的新特性

    今天我们开始SQL SERVER BI的另外一个重要的部分 --Reporting Service,相对于Integration Service和Analysis Service,Reporing S ...

  2. 【SQL Server】数据库开发指南(五)T-SQL 高级查询综合应用与实战

    本系列博文还在更新中,收录在专栏:#MS-SQL Server 专栏中. 本系列文章列表如下: [SQL Server] Linux 运维下对 SQL Server 进行安装.升级.回滚.卸载操作 [ ...

  3. SQL Server调优系列玩转篇(如何利用查询提示(Hint)引导语句运行)

    前言 前面几篇我们分析了关于SQL Server关于性能调优的一系列内容,我把它分为两个模块. 第一个模块注重基础内容的掌握,共分7篇文章完成,内容涵盖一系列基础运算算法,详细分析了如何查看执行计划. ...

  4. 在Sql Server 2005使用公用表表达式CTE简化复杂的查询语句

    公用表表达式CTE是Sql Server 2005引入的一种新的表表达式.CTE在许多方面都类似于派生表.逻辑上CTE是一个临时结果集,它仅仅存在于它发生的语句中.您可以在SELECT.INSERT. ...

  5. sql server数据库错误数据恢复(数据库连接失效,无法附加查询)

    1.服务器硬件设备清单 2.故障描述 需要进行数据恢复的服务器是一台r520型号存储,共有7块SAS硬盘分别组成raid1和raid5两组磁盘阵列.主要sql server数据库存放在C盘中,在使用过 ...

  6. 【SQL Server数据库】建库、建表、简单查询语句(一)

    记录数据库原理实验所用到的代码. 创建数据库 创建名称为XSGL_CP的数据库. create database XSGL_CP --设置主文件的逻辑名称.文件名.初始大小.最大文件大小限制.需要增加 ...

  7. SQL Server 2005系列教学(6) 多表操作及子查询

    多表查询:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 人事 ...

  8. 在sql server里,日期字段按天数进行group by查询的方法

    比如一张表里有如下时间字段的记录: 2009-01-01 12:00:00 2008-12-23 11:00:11 2009-12-22 11:22:00 2009-01-01 14:00:00 20 ...

  9. SQL Server 2008/2012中SQL应用系列及BI学习笔记系列--目录索引

    SQL Server 2008中的一些特性总结及BI学习笔记系列,欢迎与邀月交流. 3w@live.cn  ◆0.SQL应用系列 1.SQL Server 2008中SQL增强之一:Values新用途 ...

  10. SQL Server 2008中SQL应用系列及BI学习笔记系列--目录索引 @邀月

    邀月 的数据库学习 http://www.cnblogs.com/downmoon/archive/2011/03/10/1980172.html SQL Server 2008中SQL应用系列及BI ...

最新文章

  1. 怎么在CSDN中写微信公众号推文?
  2. 2021-10-11 ! LeetCode226. 翻转二叉树 的前中后层序遍历写法
  3. 用FTP客户端实现主机和虚拟机之间文件的传输(方法2)
  4. mysql命令:查看表结构
  5. 没登录网页也能个性化推荐?一文详解浏览器指纹
  6. luabind-0.9.1在windows、linux下的使用详解及示例
  7. Spring MVC @SessionAttributes注解
  8. 用python计算矩形面积结果四舍五入保留两位小数_你还在计算器开平方?太low了吧,学霸考场都用这种方法开平方...
  9. Eclipse导入Android项目的方法(转)
  10. 关于数模中编程的一点愚见
  11. QQ城市达人接口编程及经验分享2--新接口
  12. 计算机网络共享名称乱码,电脑wifi名称显示乱码怎么回事
  13. (八)苏世民:我的经验和教训:决策(567)
  14. 紫薇星上的数据结构(1)
  15. 基于字典的中文分词算法RMM
  16. Input标签type属性
  17. android 心跳包的分析
  18. 获取Shell命令执行错误结果
  19. puzzle(018.1)数墙、留方、黑白、数方
  20. 钱袋宝屡次被罚,美团为何做不好金融?

热门文章

  1. hiho1015(kmp+统计出现次数)
  2. js window.open 参数设置
  3. Android的单位及屏幕分辨率
  4. 发现一篇不错的学习隐马尔可夫模型的文章
  5. Java Android客户端开发
  6. 盘点Mac最受欢迎的优化清理软件2020|最新|集合|排行榜
  7. 去掉Mac窗口截图自带的阴影?
  8. 【Flutter】Dart中的继承
  9. 团队作业——系统设计和任务分配
  10. 常用排序算法(三)直接插入排序