利用Script Task,我们可以做一些本身SSIS没能满足我们的,或者实现起来效果不够理想的。比如说我们想做一件这样的事情,去检查某个文件是否为空。如果我们通过Row Count组件来实现,性能上不理想,因为我又并不需要要知道究竟文件包含多少行数据。我们只需要简单地知道文件是否包含数据。我们可以通过写C#代码,去调用BinaryStream的方法来读取该文件的前几行就可以确定是否文件包含数据。总的来说,Script Task能做事情分几类:1) 读取和改变包的变量;2)读取包的属性;3)用C#或者VS代码实现业务逻辑,做有一些验证检查工作;4)控制workflow的执行;

上面说到的那个检查数据文件是否为空的例子,我们可以把这样的C#代码放到一个统一的项目中,然后编译生成DLL库(Assembly),再加载到Script Task里面(或者说被引用),这样可以减少代码的重复。

Script Task中的DTS对象其实是对Microsoft.SqlServer.Dts.Tasks.ScriptTask.ScriptObjectModel的实例化。它包含了一下的成员:

1) Connections:可以引用Package的Connection Managers
2) Events:可以引用Package的Events

3) ExecutionValue:

4) TaskResult:可以用来手动指定成功(success)或者失败(failure)

5) Transaction

6) VariableDispenser:可以用来获取包的Variables

7) Variables:可以用来存储Varibales

8) Log:写log

引用SSIS包的变量: Dts.Variables[“User::SomeStringVariable”].Value = “MyValue”;

改变包的变量Dts.Variables[“User::HappyPathEnum”].Value = 1;

改变TaskResult属性来告诉SSIS的包当前组件任务的执行是成功还是失败了,从而影响后面整个workflow的执行

Dts.TaskResult = (int)ScriptResults.Success;

VariableDispenser提供了锁定变量的方法可以防止在解除锁定该变量被改变

Dts.VariableDispenser.LockForRead("SomeVariable")

 

Dts.VariableDispenser.GetVariables(vars)可以把当前包的variables赋给某个variables集合

尝试从Variables集合中读取没有赋制值的变量将会抛出异常

Script Task对变量是大小写敏感的,必须把要再script代码中用到变量设置到ReadOnlyVariables或ReadWriteVariables

下面是一个Script Task连接DataSource的例子:

public void Main()
{
string myPackageId = Dts.Variables[“System::PackageID”].Value.ToString();
string myValue = string.Empty;
string cmdString = “SELECT VALUE FROM SSIS_SETTING “ +
“WHERE PACKAGE_ID= @PACKAGEID And SETTING= @SETTINGID”;
try
{
SqlConnection mySqlConn =
(SqlConnection)Dts.Connections[0].AcquireConnection(null);
mySqlConn = new SqlConnection(mySqlConn.ConnectionString);
mySqlConn.Open();
SqlCommand cmd = new SqlCommand();
cmd.CommandText = cmdString;
SqlParameter parm = new SqlParameter(“@PACKAGEID”, SqlDbType.UniqueIdentifier);
parm.Value = new Guid(myPackageId);
cmd.Parameters.Add(parm); parm = new SqlParameter(“@SETTINGID”,
SqlDbType.NVarChar);
parm.Value = “LOGFILEPATH”;
cmd.Parameters.Add(parm);
cmd.Connection = mySqlConn;
cmd.CommandText = cmdString;
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
myValue = reader[“value”].ToString();
}
Dts.Variables[“User::LOGFILEPATH”].Value = myValue;
reader.Close();
mySqlConn.Close();
mySqlConn.Dispose();
}
catch
{
Dts.TaskResult = (int)ScriptResults.Failure;
throw;
}
System.Windows.Forms.MessageBox.Show(myValue);
Dts.TaskResult = (int)ScriptResults.Success;
}

下面是Script Task从FTP Server拿数据的例子:
ConnectionManager conn = default(ConnectionManager);
FtpClientConnection ftp = default(FtpClientConnection);
string[] folderNames = null;
string[] fileNames = null;
ArrayList fileArray = new ArrayList();
conn = Dts.Connections(“FTPServer”);
ftp = new FtpClientConnection(conn.AcquireConnection(null));
ftp.Connect();
ftp.GetListing(folderNames, fileNames);
foreach (string s in fileNames) {
fileArray.Add(s);
}
Dts.Variables(“FileList”).Value = fileArray;
ftp.Close();
Dts.TaskResult = ScriptResults.Success;

下面是Script Task写入数据到XML文件的例子:
public void Main()
{
SqlConnection sqlConn;
string cmdString = “SELECT * FROM SSIS_SETTING “;
try
{
sqlConn = (SqlConnection)(Dts.Connections[“AdventureWorks”])
.AcquireConnection(Dts.Transaction
);
sqlConn = new SqlConnection(sqlConn.ConnectionString);
sqlConn.Open();
SqlCommand cmd = new SqlCommand(cmdString, sqlConn);
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
ds.WriteXml(new System.IO.StreamWriter
(“C:\\ProSSIS\\Files\\myPackageSettings.xml”));
sqlConn.Close();
}
catch
{
Dts.TaskResult = (int)ScriptResults.Failure;
throw;
}
Dts.TaskResult = (int)ScriptResults.Success;
}

下面是Script Task序列化数据再写入到XML文件的例子:
public void Main()
{
SqlConnection sqlConn;
string cmdString = “SELECT * FROM SSIS_SETTING “;
try
{
sqlConn = (SqlConnection)(Dts.Connections[“AdventureWorks”])
.AcquireConnection(Dts.Transaction
);
sqlConn = new SqlConnection(sqlConn.ConnectionString);
sqlConn.Open();
SqlCommand cmd = new SqlCommand(cmdString, sqlConn);
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
ds.WriteXml(new System.IO.StreamWriter
(“C:\\ProSSIS\\Files\\myPackageSettings.xml”));
sqlConn.Close();
}
catch
{
Dts.TaskResult = (int)ScriptResults.Failure;
throw;
}
Dts.TaskResult = (int)ScriptResults.Success;
}

用XMLSerializer类来序列化XML数据
[Serializable()]
public class SSISSetting
{
public string PackageId { get; set; }
public string Setting { get; set; }
public string Value { get; set; }
}

public void Main()
{
SqlConnection sqlConn;
string cmdString = “SELECT * FROM SSIS_SETTING “;
try
{
sqlConn = (SqlConnection)(Dts.Connections[“AdventureWorks”])
.AcquireConnection(Dts.Transaction);
sqlConn = new SqlConnection(sqlConn.ConnectionString);
sqlConn.Open();
SqlCommand cmd = new SqlCommand(cmdString, sqlConn);
SqlDataReader dR = cmd.ExecuteReader();
List<SSISSetting> arrayListSettings = new List<SSISSetting>();
while (dR.Read())
{
SSISSetting oSet = new SSISSetting();
oSet.PackageId = dR[“PACKAGE_ID”].ToString();
oSet.Setting = dR[“SETTING”].ToString();
oSet.Value = dR[“VALUE”].ToString();
arrayListSettings.Add(oSet);
}
StreamWriter outfile = new StreamWriter
(“C:\\ProSSIS\\Files\\myObjectXmlSettings.xml”);
XmlSerializer ser = new XmlSerializer(typeof(List<SSISSetting>));
ser.Serialize(outfile, arrayListSettings);
outfile.Close();
outfile.Dispose();
sqlConn.Close();
}
catch
{
Dts.TaskResult = (int)ScriptResults.Failure;
throw;
}
Dts.TaskResult = (int)ScriptResults.Success;
}

我们也可以手工触发Event Handler

public void Main()
{
string taskName = Dts.Variables[“System::TaskName”].Value.ToString();
bool retVal = false;
Dts.Events.FireInformation(0, taskName, String.Format
(“Starting Loop Operation at {0} “,
DateTime.Now.ToString(“MM/dd/yyyy hh:mm:ss”)), “”, 0,
ref retVal);
for(int i=0; i <= 10; i++)
{
Dts.Events.FireProgress(String.Format(”Loop in iteration {0}”, i),
i * 10, 0, 10, taskName, ref retVal);
}
Dts.Events.FireInformation(0, taskName, String.Format(”Completion Loop Operation
at {0} ”, DateTime.Now.ToString(”mm/dd/yyyy hh:mm:ss”)), ””, 0, ref retVal);
Dts.Events.FireWarning(1, taskName, ”This is a warning we want to pay attention
to...”, ””, 0);
Dts.Events.FireWarning(2, taskName, ”This is a warning for debugging only...”,
””, 0);
Dts.Events.FireError(0, taskName, ”If we had an error it would be here”, ””, 0);
}

SSIS ->> Script Task的更多相关文章

  1. 转 Refresh Excel Pivot Tables Automatically Using SSIS Script Task

    Refresh Excel Pivot Tables Automatically Using SSIS Script Task https://www.mssqltips.com/sqlservert ...

  2. ssis的script task作业失败(调用外部dll)

    原文 ssis的script task作业失败 我的ssis作业包里用了一个script task,会查询一个http的页面接口,获取json数据后解析然后做后续处理,其中解析json引用了本地目录下 ...

  3. 微软BI 之SSIS 系列 - 使用 Script Task 访问非 Windows 验证下的 SMTP 服务器发送邮件

    原文:微软BI 之SSIS 系列 - 使用 Script Task 访问非 Windows 验证下的 SMTP 服务器发送邮件 开篇介绍 大多数情况下我们的 SSIS 包都会配置在 SQL Agent ...

  4. Script Task 引用 package variable

    Script Task 能够使用C#代码进行编程,许多复杂的逻辑都可以使用C# 脚本来实现,不仅灵活,而且强大. 1,能够传递package variable 给 Script Task ,并且Scr ...

  5. SSIS ->> Script Debugging and Troubleshooting

    Breakpoint是调试过程中最重要的手段,不仅对于Script Task和Script Component,对于任何其他的组件也是如此.可以在某个Event(如OnError)触发的时候设置断点来 ...

  6. 如何管理和记录 SSIS 各个 Task 的开始执行时间和结束时间以及 Task 中添加|删除|修改的记录数

    开篇语 在这篇日志中 如何在 ETL 项目中统一管理上百个 SSIS 包的日志和包配置框架 我介绍到了包级别的日志管理框架,那么这个主要是针对包这一个层级的 Log 信息,包括包开始执行和结束时间,以 ...

  7. 微软BI 之SSIS 系列 - MVP 们也不解的 Scrip Task 脚本任务中的一个 Bug

    开篇介绍 前些天自己在整理 SSIS 2012 资料的时候发现了一个功能设计上的疑似Bug,在 Script Task 中是可以给只读列表中的变量赋值.我记得以前在 2008 的版本中为了弄明白这个配 ...

  8. 微软BI 之SSIS 系列 - Execute SQL Task 中的 Single Row 与 Full Result Set 的处理技巧

    开篇介绍 Execute SQL Task 这个控件在微软BI ETL 项目中使用的频率还是非常高的,也是大部分入门 SSIS 初学者最早接触到的几个控制流控件. 我们通常使用 Execute SQL ...

  9. SSIS之-DTS对象&事件

    1.Dts 是类 Microsoft.SqlServer.Dts.Tasks.ScriptTask.ScriptObjectModel 类的一个实例,Dts 对象有 7 个属性和一个方法,以下是DTS ...

随机推荐

  1. php编写验证码

    今天学习到了php登录时的验证码,验证码在我们平时的网站建设中是非常重要的,对于放置一些灌水机.脚本攻击是一个很好地策略. 下面是我写的代码: <?php session_start(); // ...

  2. Jquery $.getJSON()设置同步

    如下: $.ajaxSettings.async = false; $.getJSON('/AjaxSwitchDynamicInfo/GetPortUsedCount.cspx', { switch ...

  3. android实现左右滑动菜单

    直接看效果图:       主要实现代码: package com.way.view; import android.content.Context; import android.media.Den ...

  4. Zabbix全方位告警接入-电话/微信/短信都支持

    百度告警平台地址: http://gaojing.baidu.com 联系我们: 邮箱:gaojing@baidu.com 电话:13924600771 QQ群:183806029 对于使用zabbi ...

  5. sqlserver 查看锁表,解锁

    查看被锁表: 代码如下 复制代码 select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName ...

  6. razor GPU

    抓之前要把设置里面 Setting -Debug Setting -Graphic -PA DEBUG yes -RAZOR GPU yes replay是个很有用的功能,要设置 -Debug Set ...

  7. try-catch语句讲解

    try-catch 语句由一个 try 块后跟一个或多个 catch 子句构成,这些子句指定不同的异常处理程序. 引发异常时,公共语言运行时 (CLR) 会查找处理此异常的 catch 语句. 如果当 ...

  8. C++中static的全部作用

    要理解static,就必须要先理解另一个与之相对的关键字,很多人可能都还不知道有这个关键字,那就是auto,其实我们通常声明的不用static修饰的变量,都是auto的,因为它是默认的,就象short ...

  9. STM32 对内部FLASH读写接口函数

    因为要用内部FLASH代替外部EEPROM,把参数放在STM32的0x08000000+320K处,其中20K是bootloader,300K是应用程序. 原理:先要把整页FLASH的内容搬到RAM中 ...

  10. asp.net 认证与授权

    1.下面的例子在web.config文件中配置网站使用asp.net forms 身份认证方式: <configuration> <system.web> <authen ...