我有一个名为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.
请帮帮我。
答案 0 :(得分:56)
这是一个可能的选择。以下示例可能会让您了解如何使用Send Email task
通过电子邮件发送结果集。此示例显示如何遍历查询结果集以形成将使用Send Email task
通过电子邮件发送的邮件正文。
如果您不想在结果集为空白时发送电子邮件,则可以在循环结果集和发送电子邮件之间的优先约束中添加Expression
任务。
该示例使用SSIS 2008 R2和SQL Server 2008 R2数据库。
分步流程:
使用 SQL Scripts 部分下提供的脚本创建名为dbo.EmailData
的表。
屏幕截图# 1 显示Execute SQL
任务将在此示例中查询并通过电子邮件发送的示例数据。
在SSIS包中,创建 5 变量,如屏幕截图# 2 所示。
在SSIS包中,在 Foreach循环容器和{{1}中放置以下任务:Execute SQL task
,Foreach loop container
,Script task
}。
配置Send Email task
,如屏幕截图# 3 和# 4 所示。
配置Execute SQL task
,如屏幕截图# 5 和# 6 所示。 “变量映射”部分显示查询结果列的显示顺序以及如何将它们分配给SSIS变量。这些变量将用于在Foreach loop container
。
在Script task
中,将代码替换为脚本任务代码部分下显示的代码。脚本任务具有非常简单的纯文本电子邮件格式。
配置发送电子邮件任务,如屏幕截图# 7 所示。您需要在从和到字段中使用有效的电子邮件地址对其进行配置。
配置控制流程任务后,您的软件包应如屏幕截图# 8 所示。
示例包执行显示在屏幕截图# 9 中。
该软件包发送的电子邮件显示在屏幕截图# 10 中。某些信息已从屏幕截图中删除。您可以将屏幕截图# 1 中显示的表格数据与此电子邮件输出进行比较,它们应该相同。
希望有所帮助。
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:
屏幕截图#2:
屏幕截图#3:
屏幕截图#4:
屏幕截图#5:
屏幕截图#6:
屏幕截图#7:
屏幕截图#8:
屏幕截图#9:
屏幕截图#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。
第2步:使用Execute SQL Task Editor并选择Result set选项作为Full result set和一个查询语句以从给定表中获取数据。使用对象变量来保存表的结果集,如以下屏幕截图所示:
步骤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");