如何在SSIS的脚本组件中访问变量

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介: 原文:如何在SSIS的脚本组件中访问变量这是一个小问题,我们在SSIS的设计中很多地方都会用到变量,我习惯性地将“变量”和“表达式”称为SSIS的灵魂,虽然不见得绝对准确,但它们确实是保证一个SSIS包灵活性的根本。
原文: 如何在SSIS的脚本组件中访问变量

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

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

 

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

image

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

image

代码大致如下

/* 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
        */


        MessageBox.Show(Variables.test.ToString());
        
        
        
    }

}

 

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

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

image

上述错误的意思是,除非在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();//解锁
       
        
        
    }
相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
7月前
|
编译器 C# 开发者
C# 10.0中的全局`using`指令:简化命名空间引用的新方式
【1月更文挑战第4天】本文介绍了C# 10.0中引入的全局`using`指令,该指令允许开发者在项目级别统一管理命名空间引用,从而消除源文件中重复的`using`语句。全局`using`指令通过减少冗余代码、提高可维护性和统一命名空间管理,为开发者带来了更高效的编码体验。文章详细解释了如何实现全局`using`指令,并探讨了其在实际项目中的优势和适用场景。
|
算法 前端开发 UED
封装一个快速生成目录树的全局脚本
封装一个快速生成目录树的全局脚本
81 0
|
开发框架 .NET 数据库
.NETCore 获取数据库上下文[实例的方法和配置连接字符串
.NETCore 获取数据库上下文[实例的方法和配置连接字符串
776 1
|
6月前
|
JavaScript
vue : 无法将“vue”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。
vue : 无法将“vue”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。
|
6月前
|
JavaScript
vue : 无法将“vue”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保 路径正确,然后再试一次。
vue : 无法将“vue”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保 路径正确,然后再试一次。
|
7月前
|
SQL 数据库连接 数据库
ODBC配置数据源及相关问题(“找不到工程和库”“实时错误91对象变量或with块变量未设置”等)
ODBC配置数据源及相关问题(“找不到工程和库”“实时错误91对象变量或with块变量未设置”等)
|
运维 Shell Linux
【运维知识高级篇】超详细的Shell编程讲解1(Shell作用+脚本书写方式+脚本执行方式+变量分类+变量配置文件+变量定义+Shell重要的位置变量+三种传参方式)
【运维知识高级篇】超详细的Shell编程讲解1(Shell作用+脚本书写方式+脚本执行方式+变量分类+变量配置文件+变量定义+Shell重要的位置变量+三种传参方式)
361 1
|
网络协议 C# C++
关于 C#调用一个C/C++dll库运行时实现多个应用(静态变量区分) 的解决方法
关于 C#调用一个C/C++dll库运行时实现多个应用(静态变量区分) 的解决方法
关于 C#调用一个C/C++dll库运行时实现多个应用(静态变量区分) 的解决方法
|
IDE 测试技术 开发工具
一个方法帮你在正式脚本里添加“子脚本”的运行
一个方法帮你在正式脚本里添加“子脚本”的运行
233 0
|
Java Shell 程序员
shel脚本基础系列(一)变量
shel脚本基础系列(一)变量
111 0
shel脚本基础系列(一)变量