博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何在SSIS的脚本组件中访问变量
阅读量:6994 次
发布时间:2019-06-27

本文共 2038 字,大约阅读时间需要 6 分钟。

这是一个小问题,我们在SSIS的设计中很多地方都会用到变量,我习惯性地将“变量”和“表达式”称为SSIS的灵魂,虽然不见得绝对准确,但它们确实是保证一个SSIS包灵活性的根本。

同时,我们可能也会在数据流任务中添加“脚本组件”,用我们熟知的C#或者VB.NET编写一些数据转换处理的逻辑。这里可能就有一个需求,我们希望在脚本组件中访问变量(读或者写),但默认情况下,这个需求并不是那么容易实现。我们来看下面的例子

 

这个例子中,我们在Package级别定义了一个变量,名称为test

然后,我们在数据流中有一个Script Component,我们尝试在里面对上面这个变量进行读写

代码大致如下

/* Microsoft SQL Server Integration Services Script Component*  Write scripts using Microsoft Visual C# 2008.*  ScriptMain is the entry point class of the script.*/using System;using System.Data;using Microsoft.SqlServer.Dts.Pipeline.Wrapper;using Microsoft.SqlServer.Dts.Runtime.Wrapper;using System.Windows.Forms;[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]public class ScriptMain : UserComponent{    public override void PreExecute()    {        base.PreExecute();        /*          Add your code here for preprocessing or remove if not needed        */    }    public override void PostExecute()    {        base.PostExecute();        /*          Add your code here for postprocessing or remove if not needed          You can set read/write variables here, for example:          Variables.MyIntVar = 100        */    }    public override void Input0_ProcessInputRow(Input0Buffer Row)    {        /*          Add your code here        */                                    }}

 

代码很简单,也很自然。我只是作为演示,这里读取到那个变量之后,显示出来。

但是这个代码是不能运行的,有如下错误

上述错误的意思是,除非在PostExecute方法里面,是不可以对变量进行读写的。这里的原因是,ProcessInputRow这个方法,因为是每一行数据都会执行一次,所以如果这里随意读写变量的话,会因为要频繁加锁和解锁,造成效率方面的问题。

 

这里谈到了一个加锁的问题。为什么会有这个问题呢?其实很简单,因为变量是定义在Package级别,所以很可能几个任务在同时访问这些变量,都在对其进行读写。如果不加锁,则可能导致不可预期的结果。

 

如果你理解了上述机制,而且也确定可以承担锁定可能带来的性能损耗,那么要解决问题,可以通过如下的方式实现

 

public override void Input0_ProcessInputRow(Input0Buffer Row)    {        /*          Add your code here        */        VariableDispenser.LockForRead("User::test");//这里先声明对某个变量进行锁定        IDTSVariables100 vs = null;        this.VariableDispenser.GetVariables(out vs);//通过VariableDispenser获取变量集合        MessageBox.Show(vs["User::test"].Value.ToString());        vs.Unlock();//解锁                           }

转载地址:http://baivl.baihongyu.com/

你可能感兴趣的文章
DVI和VGA区别
查看>>
Hbase 简单操作
查看>>
Exadata Cellserv 如何列出存储告警信息
查看>>
如何给Exadata数据库一体机打补丁patching图解
查看>>
我的友情链接
查看>>
集算器提升Java的计算能力
查看>>
【创建型】- 建造者模式
查看>>
我的友情链接
查看>>
findbugs问题解析
查看>>
jedis以pipeline方式调用redis
查看>>
6.Heartbeat和DRBD 高可用
查看>>
javascript---循环输出对象中的属性
查看>>
sqlalchemy--python的数据库连接
查看>>
jdk1.5新特性3之加强for循环
查看>>
Java中的ConcurrentHashMap原理分析节选
查看>>
18.文件系统——扩展、缩减卷组和逻辑卷以及创建快照卷、移除卷
查看>>
转载之N个短小却超实用的JavaScript 代码段
查看>>
MySQL的程序介绍
查看>>
冒泡排序
查看>>
【SQL Server学习笔记】全文检索
查看>>