Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SSIS-向不同的收件人发送电子邮件不同的数据_Sql Server_Ssis - Fatal编程技术网

Sql server SSIS-向不同的收件人发送电子邮件不同的数据

Sql server SSIS-向不同的收件人发送电子邮件不同的数据,sql-server,ssis,Sql Server,Ssis,我是SSIS的新手 我有一个1500行的表格,我需要从该表格发送电子邮件,但每个收件人有15行 因此,我需要从同一个查询向不同的电子邮件发送不同的数据 你们能帮帮我吗 提前谢谢 狮子座 -------------------更新------------------------ 伙计们,我可以创建一个SSIS包向不同的收件人发送电子邮件问题是:示例:2个不同的用户接收的电子邮件的行数与他们在数据库中的行数相同…这太糟糕了,每个客户有15行,这将是15封电子邮件。我可以为客户发送一封包含全部数据的电

我是SSIS的新手

我有一个1500行的表格,我需要从该表格发送电子邮件,但每个收件人有15行

因此,我需要从同一个查询向不同的电子邮件发送不同的数据

你们能帮帮我吗

提前谢谢

狮子座

-------------------更新------------------------


伙计们,我可以创建一个SSIS包向不同的收件人发送电子邮件问题是:示例:2个不同的用户接收的电子邮件的行数与他们在数据库中的行数相同…这太糟糕了,每个客户有15行,这将是15封电子邮件。我可以为客户发送一封包含全部数据的电子邮件吗


提前感谢…

这将根据查询和其他规范有所不同,但在较高级别上,您可能希望按照以下步骤使用SSI发送电子邮件。本例假设电子邮件存储在此表中的一列中。正如其他人所指出的,使用sp_send_dbmail可能是最好的选择

  • 创建两个字符串变量。一个将保存电子邮件地址,另一个将用于SQL for
    sp\u send\u dbmail
    (下面将对此进行详细介绍)。创建一个对象类型的附加变量,该变量将在执行期间保存电子邮件列表
  • 将保存SQL for
    sp\u send\u dbmail
    的字符串变量修改为使用带有电子邮件名称的变量的表达式。根据查询的不同,您可能需要为此查询中的其他参数添加其他变量。这个变量的一个例子在本文末尾
  • 有一个查询表并检索电子邮件地址的初始执行SQL任务。确保获取每封电子邮件的所有行。将
    ResultSet
    属性设置为full,并在“结果集”窗格上添加对象变量,将
    0
    作为结果名称
  • 接下来添加一个Foreach循环,使用Foreach ADO枚举器类型,并从上一个executesql任务中为源变量选择对象变量。枚举模式可以保留为“第一个表中的行”选项
  • 在变量映射窗格中,添加字符串变量(用于电子邮件地址),并将索引设置为
    0
    。这将保存每次执行
    sp\u send\u dbmail
    时的电子邮件地址

  • 在Foreach循环中,添加一个executesql任务。为此,您需要将
    SQLSourceType
    设置为变量,并使用一个包含SQL的变量
    sp\u send\u dbmail

  • 确保为所使用的帐户和配置文件正确配置了数据库邮件,包括
    msdb
    DatabaseMailUserRole
    角色的成员资格。您可能还需要为表使用由三部分组成的名称(database.schema.table)
示例SQL变量表达式:

注意@
query
参数中电子邮件变量周围的双引号,以及连接表达式的引号。您可以在查询中使用两个单引号或在双引号前面加上
\
,以将双引号用作表达式的一部分

"DECLARE @Title varchar(100)

SET @Title = 'Email Title'

EXEC MSDB.DBO.SP_SEND_DBMAIL @profile_name = 'Your Profile',
 @recipients = 'YourEmail@test.org',  

@query = 'SELECT * FROM YourDatabase.YourSchema.YourTable WHERE EmailColumn = "" 
+ @[User::VariableWithEmailAddress]  + ""',
@query_result_no_padding = 1, @subject = @Title ; "

这将根据查询和其他规范有所不同,但在较高的级别上,您可能希望按照以下步骤使用SSI发送电子邮件。本例假设电子邮件存储在此表中的一列中。正如其他人所指出的,使用sp_send_dbmail可能是最好的选择

  • 创建两个字符串变量。一个将保存电子邮件地址,另一个将用于SQL for
    sp\u send\u dbmail
    (下面将对此进行详细介绍)。创建一个对象类型的附加变量,该变量将在执行期间保存电子邮件列表
  • 将保存SQL for
    sp\u send\u dbmail
    的字符串变量修改为使用带有电子邮件名称的变量的表达式。根据查询的不同,您可能需要为此查询中的其他参数添加其他变量。这个变量的一个例子在本文末尾
  • 有一个查询表并检索电子邮件地址的初始执行SQL任务。确保获取每封电子邮件的所有行。将
    ResultSet
    属性设置为full,并在“结果集”窗格上添加对象变量,将
    0
    作为结果名称
  • 接下来添加一个Foreach循环,使用Foreach ADO枚举器类型,并从上一个executesql任务中为源变量选择对象变量。枚举模式可以保留为“第一个表中的行”选项
  • 在变量映射窗格中,添加字符串变量(用于电子邮件地址),并将索引设置为
    0
    。这将保存每次执行
    sp\u send\u dbmail
    时的电子邮件地址

  • 在Foreach循环中,添加一个executesql任务。为此,您需要将
    SQLSourceType
    设置为变量,并使用一个包含SQL的变量
    sp\u send\u dbmail

  • 确保为所使用的帐户和配置文件正确配置了数据库邮件,包括
    msdb
    DatabaseMailUserRole
    角色的成员资格。您可能还需要为表使用由三部分组成的名称(database.schema.table)
示例SQL变量表达式:

注意@
query
参数中电子邮件变量周围的双引号,以及连接表达式的引号。您可以在查询中使用两个单引号或在双引号前面加上
\
,以将双引号用作表达式的一部分

"DECLARE @Title varchar(100)

SET @Title = 'Email Title'

EXEC MSDB.DBO.SP_SEND_DBMAIL @profile_name = 'Your Profile',
 @recipients = 'YourEmail@test.org',  

@query = 'SELECT * FROM YourDatabase.YourSchema.YourTable WHERE EmailColumn = "" 
+ @[User::VariableWithEmailAddress]  + ""',
@query_result_no_padding = 1, @subject = @Title ; "

我有一个软件包,唯一的作用是从我的软件包中发送电子邮件,并将结果记录到表中。我从任何包中反复使用这个包
    public string BuildHTMLTablefromDataTable(DataTable t)
    {
        System.Text.StringBuilder sb = new System.Text.StringBuilder();
        sb.Append("<table border='1'><tr style='background-color: #1A5276; color:#FFFFFF;'>");

        foreach (DataColumn c in t.Columns)
        {
            sb.Append("<th align='left'>");
            sb.Append(c.ColumnName);
            sb.Append("</th>");
        }

        sb.Append("</tr>");

        int rc = 0;

        foreach (DataRow r in t.Rows)
        {
            rc++;
            //every other row switches from white to gray
            string OpeningTR = "<tr style='background-color: " + ((rc % 2 == 1) ? "#E5E7E9;'>" : "#FCF3CF;'>");
            sb.Append(OpeningTR);

            foreach (DataColumn c in t.Columns)
            {
                sb.Append("<td align='left'>");
                sb.Append(System.Web.HttpUtility.HtmlEncode(
                                                            r[c.ColumnName] == null ? String.Empty : r[c.ColumnName].ToString()
                                                            )); //This will handle any invalid characcters and convert null to empty string
                sb.Append("</td>");
            }

            sb.Append("</tr>");
        }

        sb.Append("</table>");

        return sb.ToString();
    }


    public string BuildBody(DataTable dt)
    {

        string body = "<P>The following are vouchers that are not in the voucher table but in the GL:</p>";

        DataView v = new DataView(dt);
        body += BuildHTMLTablefromDataTable(dt); //v.ToTable(true, "Name", "LastVisit", "DaysUntilTimeout", "ExpDate", "RoleName"));

        return body;
    }


    public void Main()
    {
        #region Read Variables
        System.Data.OleDb.OleDbDataAdapter da = new System.Data.OleDb.OleDbDataAdapter();
        DataTable dt = new DataTable();
        da.Fill(dt, Dts.Variables["User::Changes"].Value);
        #endregion

        string body = BuildBody(dt);

        Dts.Variables["User::Body"].Value = body;


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