如何使用SSIS包从电子邮件正文中的表中发送记录?

时间:2011-06-22 12:17:37

标签: ssis

我有一个名为Product的表。

产品表有更多记录,有些时候表没有记录。

所以我想查看产品表,

if it's have the records i send all table information as mail.

if it's not have record no need to send mail.

请帮帮我。

3 个答案:

答案 0 :(得分:56)

这是一个可能的选择。以下示例可能会让您了解如何使用Send Email task通过电子邮件发送结果集。此示例显示如何遍历查询结果集以形成将使用Send Email task通过电子邮件发送的邮件正文。

如果您不想在结果集为空白时发送电子邮件,则可以在循环结果集发送电子邮件之间的优先约束中添加Expression 任务。

该示例使用SSIS 2008 R2和SQL Server 2008 R2数据库。

分步流程:

  1. 使用 SQL Scripts 部分下提供的脚本创建名为dbo.EmailData的表。

  2. 屏幕截图# 1 显示Execute SQL任务将在此示例中查询并通过电子邮件发送的示例数据。

  3. 在SSIS包中,创建 5 变量,如屏幕截图# 2 所示。

  4. 在SSIS包中,在 Foreach循环容器和{{1}中放置以下任务:Execute SQL taskForeach loop containerScript task }。

  5. 配置Send Email task,如屏幕截图# 3 和# 4 所示。

  6. 配置Execute SQL task,如屏幕截图# 5 和# 6 所示。 “变量映射”部分显示查询结果列的显示顺序以及如何将它们分配给SSIS变量。这些变量将用于在Foreach loop container

  7. 中形成电子邮件
  8. Script task中,将代码替换为脚本任务代码部分下显示的代码。脚本任务具有非常简单的纯文本电子邮件格式。

  9. 配置发送电子邮件任务,如屏幕截图# 7 所示。您需要在字段中使用有效的电子邮件地址对其进行配置。

  10. 配置控制流程任务后,您的软件包应如屏幕截图# 8 所示。

  11. 示例包执行显示在屏幕截图# 9 中。

  12. 该软件包发送的电子邮件显示在屏幕截图# 10 中。某些信息已从屏幕截图中删除。您可以将屏幕截图# 1 中显示的表格数据与此电子邮件输出进行比较,它们应该相同。

  13. 希望有所帮助。

    SQL脚本:

    Script task

    脚本任务代码:

    C#代码,只能在 CREATE TABLE [dbo].[EmailData]( [Id] [int] IDENTITY(1,1) NOT NULL, [ItemId] [varchar](255) NOT NULL, [ItemName] [varchar](255) NOT NULL, [ItemType] [varchar](255) NOT NULL, [IsProcessed] [bit] NULL, CONSTRAINT [PK_EmailData] PRIMARY KEY CLUSTERED ([Id] ASC)) ON [PRIMARY] GO 中使用。

    SSIS 2008 and above

    屏幕截图#1:

    1

    屏幕截图#2:

    2

    屏幕截图#3:

    3

    屏幕截图#4:

    4

    屏幕截图#5:

    5

    屏幕截图#6:

    6

    屏幕截图#7:

    7

    屏幕截图#8:

    8

    屏幕截图#9:

    9

    屏幕截图#10:

    10

答案 1 :(得分:1)

你可以采用不同的方法.. 只需从SSIS执行SQL数据库任务即可执行SP"仅当您特别希望执行SSIS步骤时才执行#34; (或者你可以创建SP并在它的作业调度程序中安排它)。 在SP内部,您可以发送电子邮件。 如果您不知道如何设置电子邮件个人资料,请参阅此(https://www.codeproject.com/Articles/485124/Configuring-Database-Mail-in-SQL-Server

示例如下 -

CREATE TABLE #Temp 
( 
  [Rank]  [int],
  [Player Name]  [varchar](128),
  [Ranking Points] [int],
  [Country]  [varchar](128)
)


INSERT INTO #Temp
SELECT 1,'Manoj Kargeti',12390,'India'
UNION ALL
SELECT 2,'Vimal Kumar',7965,'Nepal'
UNION ALL
SELECT 3,'Pappu Djokovic',7880,'ShriLanka'


DECLARE @xml NVARCHAR(MAX)
DECLARE @body NVARCHAR(MAX)


SET @xml = CAST(( SELECT [Rank] AS 'td','',[Player Name] AS 'td','',
       [Ranking Points] AS 'td','', Country AS 'td'
FROM  #Temp ORDER BY Rank 
FOR XML PATH('tr'), ELEMENTS ) AS NVARCHAR(MAX))


SET @body ='<html><body><H3>Tennis Rankings Info</H3>
<table border = 1> 
<tr>
<th> Rank </th> <th> Player Name </th> <th> Ranking Points </th> <th> Country </th></tr>'    


SET @body = @body + @xml +'</table></body></html>'


EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'SQL ALERTING', -- replace with your SQL Database Mail Profile 
@body = @body,
@body_format ='HTML',
@recipients = 'bruhaspathy@hotmail.com', -- replace with your email address
@subject = 'E-mail in Tabular Format' ;


DROP TABLE #Temp

答案 2 :(得分:1)

第1步:创建一个Object数据类型变量,该变量将保存给定表的结果集,并创建一个字符串类型变量以容纳收件人电子邮件ID。 variable declaration

第2步:使用Execute SQL Task Editor并选择Result set选项作为Full result set和一个查询语句以从给定表中获取数据。使用对象变量来保存表的结果集,如以下屏幕截图所示:

screen shot-1 screen shot-2

步骤3 :接受脚本任务编辑器,并将Recepient_email_id变量用作只读变量,并使用下面的C#脚本发送电子邮件。

#region Namespaces
using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
using System.Linq;
using System.Collections.Generic;
using System.Collections;
using System.Data.OleDb;
using System.Net.Mail;
using System.Net;
#endregion

namespace ST_a5f34f5fc36645b6bd90a5b8887ac589
{
    /// <summary>
    /// ScriptMain is the entry point class of the script.  Do not change the name, attributes,
    /// or parent of this class.
    /// </summary>
    [Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]
    public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
    {

        enum ScriptResults
        {
            Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
            Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
        }

        public void Main()
        {
            Variables varCollection = null;

            string User_Recepient_Email_ID = Dts.Variables["User::Recepient_Email_ID"].Value.ToString();

            Dts.VariableDispenser.LockForWrite("User::Test_Table_Result");
            Dts.VariableDispenser.GetVariables(ref varCollection);
            var data = varCollection["User::Test_Table_Result"].Value;

            OleDbDataAdapter da = new OleDbDataAdapter();
            DataTable dt = new DataTable();
            da.Fill(dt, varCollection["User::Test_Table_Result"].Value);

            SendMailMessage("loadJob@xyz.com", User_Recepient_Email_ID, "ETL Load Status Report",ConvertDataTableToHTML(dt),true,"174.18.10.122");

            Dts.TaskResult = (int)ScriptResults.Success;
        }


        public static string ConvertDataTableToHTML(DataTable dt)
        {
            string html = "<table border ='1'>";
            //add header row
            html += "<tr>";
            for (int i = 0; i < dt.Columns.Count; i++)
                html += "<th>" + dt.Columns[i].ColumnName + "</th>";
            html += "</tr>";
            //add rows
            for (int i =0;i<dt.Rows.Count;i++)
            {
                html += "<tr style='color:blue;'>";
                for (int j = 0; j < dt.Columns.Count; j++)
                    html += "<td>" + dt.Rows[i][j].ToString() + "</td>";
                html += "</tr>";
            }
            html += "</table>";
            return html;
        }
        private void SendMailMessage(string From, string SendTo,string Subject, string Body,bool IsBodyHtml,string Server)
        {
            MailMessage htmlMessage;
            SmtpClient mySmtpClient;

            htmlMessage = new MailMessage(From, SendTo, Subject, Body);
            htmlMessage.IsBodyHtml = IsBodyHtml;

            mySmtpClient = new SmtpClient(Server);
            mySmtpClient.Credentials = CredentialCache.DefaultNetworkCredentials;
            mySmtpClient.Send(htmlMessage);
        }   


    }
}

请注意:您需要在上面的脚本中更改以下声明的发件人电子邮件ID,电子邮件主题和服务器IP地址。

SendMailMessage("loadJob@xyz.com", User_Recepient_Email_ID, "ETL Load Status Report",ConvertDataTableToHTML(dt),true,"174.18.10.122");

以下是您收到的电子邮件的格式。 screen shot-3