Sql server SSIS-向不同的收件人发送电子邮件不同的数据
我是SSIS的新手 我有一个1500行的表格,我需要从该表格发送电子邮件,但每个收件人有15行 因此,我需要从同一个查询向不同的电子邮件发送不同的数据 你们能帮帮我吗 提前谢谢 狮子座 -------------------更新------------------------Sql server SSIS-向不同的收件人发送电子邮件不同的数据,sql-server,ssis,Sql Server,Ssis,我是SSIS的新手 我有一个1500行的表格,我需要从该表格发送电子邮件,但每个收件人有15行 因此,我需要从同一个查询向不同的电子邮件发送不同的数据 你们能帮帮我吗 提前谢谢 狮子座 -------------------更新------------------------ 伙计们,我可以创建一个SSIS包向不同的收件人发送电子邮件问题是:示例:2个不同的用户接收的电子邮件的行数与他们在数据库中的行数相同…这太糟糕了,每个客户有15行,这将是15封电子邮件。我可以为客户发送一封包含全部数据的电
伙计们,我可以创建一个SSIS包向不同的收件人发送电子邮件问题是:示例:2个不同的用户接收的电子邮件的行数与他们在数据库中的行数相同…这太糟糕了,每个客户有15行,这将是15封电子邮件。我可以为客户发送一封包含全部数据的电子邮件吗
提前感谢…这将根据查询和其他规范有所不同,但在较高级别上,您可能希望按照以下步骤使用SSI发送电子邮件。本例假设电子邮件存储在此表中的一列中。正如其他人所指出的,使用sp_send_dbmail可能是最好的选择
- 创建两个字符串变量。一个将保存电子邮件地址,另一个将用于SQL for
(下面将对此进行详细介绍)。创建一个对象类型的附加变量,该变量将在执行期间保存电子邮件列表sp\u send\u dbmail
- 将保存SQL for
的字符串变量修改为使用带有电子邮件名称的变量的表达式。根据查询的不同,您可能需要为此查询中的其他参数添加其他变量。这个变量的一个例子在本文末尾sp\u send\u dbmail
- 有一个查询表并检索电子邮件地址的初始执行SQL任务。确保获取每封电子邮件的所有行。将
属性设置为full,并在“结果集”窗格上添加对象变量,将ResultSet
作为结果名称0
- 接下来添加一个Foreach循环,使用Foreach ADO枚举器类型,并从上一个executesql任务中为源变量选择对象变量。枚举模式可以保留为“第一个表中的行”选项
- 在变量映射窗格中,添加字符串变量(用于电子邮件地址),并将索引设置为
。这将保存每次执行0
时的电子邮件地址sp\u send\u dbmail
- 在Foreach循环中,添加一个executesql任务。为此,您需要将
设置为变量,并使用一个包含SQL的变量SQLSourceType
sp\u send\u dbmail
- 确保为所使用的帐户和配置文件正确配置了数据库邮件,包括
中msdb
角色的成员资格。您可能还需要为表使用由三部分组成的名称(database.schema.table)DatabaseMailUserRole
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任务。确保获取每封电子邮件的所有行。将
属性设置为full,并在“结果集”窗格上添加对象变量,将ResultSet
作为结果名称0
- 接下来添加一个Foreach循环,使用Foreach ADO枚举器类型,并从上一个executesql任务中为源变量选择对象变量。枚举模式可以保留为“第一个表中的行”选项
- 在变量映射窗格中,添加字符串变量(用于电子邮件地址),并将索引设置为
。这将保存每次执行0
时的电子邮件地址sp\u send\u dbmail
- 在Foreach循环中,添加一个executesql任务。为此,您需要将
设置为变量,并使用一个包含SQL的变量SQLSourceType
sp\u send\u dbmail
- 确保为所使用的帐户和配置文件正确配置了数据库邮件,包括
中msdb
角色的成员资格。您可能还需要为表使用由三部分组成的名称(database.schema.table)DatabaseMailUserRole
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;
}