也许您现在已经找到了问题的答案。这个答案是为其他可能偶然发现这个问题的人提供的。我认为您不能在表达式中使用对象变量。您需要循环遍历查询结果对象并将其格式化为字符串,以便可以通过电子邮件发送查询输出。您还可以将数据导出到文件并将该文件作为附件发送。这是另一种可能的选择。此示例演示如何循环查询结果集以形成消息正文,然后使用“发送电子邮件”任务通过电子邮件发送该消息正文。
分步过程:
创建一个名为dbo.EmailData
使用下面提供的脚本SQL脚本部分。
截屏 #1显示样本数据Execute SQL
在此示例中,任务将查询并通过电子邮件发送它。
在 SSIS 包上,创建5变量如屏幕截图所示#2.
在 SSIS 包上,放置以下任务:Execute SQL task
, Foreach loop container
, Script task
内Foreach 循环容器 and Send Email task
.
配置Execute SQL task
如截图所示#3 and #4.
配置Foreach loop container
如截图所示#5 and #6。变量映射部分显示查询结果列出现的顺序以及它们如何分配给 SSIS 变量。这些变量将用于形成内部的电子邮件消息Script task
.
In the Script task
,将代码替换为下面显示的代码脚本任务代码部分。该脚本任务具有非常简单的纯文本电子邮件格式。
配置发送电子邮件任务,如屏幕截图所示#7。您需要使用有效的电子邮件地址进行配置From and To fields.
配置控制流任务后,您的包应如屏幕截图所示#8.
示例包执行情况如屏幕截图所示#9.
包裹发送的邮件如截图所示#10。屏幕截图中的一些信息已被删除。您可以比较屏幕截图中显示的表格数据#1通过此电子邮件输出,它们应该相同。
希望有帮助。
SQL 脚本:
.
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
脚本任务代码:
C#代码只能在SSIS 2008 and above
.
.
/*Microsoft SQL Server Integration Services Script Task
Write scripts using Microsoft Visual C# 2008.
The ScriptMain is the entry point class of the script.
*/
using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
namespace ST_7f59d09774914001b60a99a90809d5c5.csproj
{
[System.AddIn.AddIn("ScriptMain", Version = "1.0", Publisher = "", Description = "")]
public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
{
#region VSTA generated code
enum ScriptResults
{
Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
};
#endregion
public void Main()
{
Variables varCollection = null;
string header = string.Empty;
string message = string.Empty;
Dts.VariableDispenser.LockForWrite("User::EmailMessage");
Dts.VariableDispenser.LockForWrite("User::ItemId");
Dts.VariableDispenser.LockForWrite("User::ItemName");
Dts.VariableDispenser.LockForWrite("User::ItemType");
Dts.VariableDispenser.GetVariables(ref varCollection);
//Set the header message for the query result
if (varCollection["User::EmailMessage"].Value == string.Empty)
{
header = "Execute SQL task output sent using Send Email Task in SSIS:\n\n";
header += string.Format("{0}\t{1}\t\t\t{2}\n", "Item number", "Item name", "Item type");
varCollection["User::EmailMessage"].Value = header;
}
//Format the query result with tab delimiters
message = string.Format("{0}\t{1}\t{2}",
varCollection["User::ItemId"].Value,
varCollection["User::ItemName"].Value,
varCollection["User::ItemType"].Value);
varCollection["User::EmailMessage"].Value = varCollection["User::EmailMessage"].Value + message;
Dts.TaskResult = (int)ScriptResults.Success;
}
}
}
屏幕截图#1:
屏幕截图#2:
屏幕截图#3:
屏幕截图#4:
屏幕截图#5:
屏幕截图#6:
屏幕截图#7:
屏幕截图#8:
屏幕截图#9:
屏幕截图#10: