中易网

如何在SSIS中设置表名变量

答案:2  悬赏:60  
解决时间 2021-01-04 12:54
如何在SSIS中设置表名变量
最佳答案
一、SSIS变量简介

SSIS(SQL Server Integration Services,SQL Server整合服务)变量分分为两种,一种是系统变量,一种用户定义的变量。系统变量包括有关包、容器、任务或事件处理程序的非常有用的信息。例如,在运行时,MachineName系统变量包含运行包含的计算机的名称,StartTime变量包开始运行的时间。系统变量是只读的。在SSIS中,用户变量是用户在开发的过程中根据需要申明的变量。用户变量可以使用在脚本中,在由优先约束、For循环容器、派生列转换和条件性拆分转换使用的表达式中,以及在更新属性值的属性表达式中。

在各种编程语言中申明的变量一般情况下都会有作用范围的,SSIS变量也不例外,SSIS变量也是有作用范围的。根据作用范围分类,变量分为包变量和组件变量。包变量在包任何一个组件中都可以调用,组件变量只能够在声明变量的组件中有效。在变量的窗口中可以看到变量的作用域。

可以看到i变量的作用域是整个Package1包,而myconfig变量作用域是数据流任务组件。

二、SSIS用户变量的声明、赋值、使用

1、申明变量

申明变量是非常简单、如果你要申明包变量,只要单击控制流选项卡,然后在包开发区域空白处单击右键选择变量命令,或者新建变量按钮就新建一个变量,输入名称,选择数据类型,赋初值就完成了。

如果要声明某数据流任务组件使用的变量,只要双击该数据流任务组件,在流控制控制选项卡空白的地方单击右键选择变量命名,在变量窗口中新建一个变量命令,在变量窗口中新建一个变量,这时变量的作用域就是你选择的流任务组件。

2、赋值

在实际开发中,除了在变量声明的时候给变量赋值外,还有两种方式,一种是通过执行SQL任务组件返回值的方式给变量赋值,一种是通过脚本组件来给变量赋值。

在执行SQL任务组件方法是先设置好组件的数据库连接属性,然后输入从数据库取数据的SQL语句,设置组件返回的结果集为单行。在结果集界面中单击“新建”,在结果集那一列输入你刚才SQL返回列的名称,在变量名称列选择你要赋值的变量

图中红色方框中的SQL语句非常简单,返回单行,结果是1。在图4中,将返回的result列的一行赋值给用户变量i。

利用脚本组件赋值变量比较简单,只需要设置脚本组件的ReadOnlyvariable或者ReadWriteVariable,将变量的名称设置他们的值(多个变量以逗号分割),它们的区别是前者在脚本组件只能够读,或者可以读写。然后在脚本组件中通过

Dts.Varables("变量名称").Value=值

3、变量的使用

变量在ssis中使用的地方很多,笔者介绍两个典型的应用。

(1) 执行 SQL 任务组件的参数

假定申明了一个日期类型变量StartDate,用户需要通过从某个表中选择在StartDate日期之前的数据,这个时候需要将StartDate作为参数传给执行 SQL 任务组件。在执行 SQL 任务组件输入SQL的地方输入如下命令语句:

SELECt * FROM TABLE_a WHERe 日期字段 < ?

然后在参数据映射界面新增映射,在变量名称列选择用户变量StartDate,选择类型为DATE,在参数名称列输入给参数取的名称。这样就可以将StartDate变量传给SQL任务组件的SQL语句了。

(2) 在脚本组件中赋值

可以在脚本组件中通过Dts.Variables("i").Value = 1方式赋值给变量,也可以通过这种方式来使用变量。比如Dts.Variables("other_variable").Value = Dts.Variables("i").Value+1,这个语句是可以在脚本组件中执行的,将i变量加1后赋值给另外一个变量。
全部回答
同时,我们可能也会在数据流任务中添加“脚本组件”,用我们熟知的c#或者vb.net编写一些数据转换处理的逻辑。这里可能就有一个需求,我们希望在脚本组件中访问变量(读或者写),但默认情况下,这个需求并不是那么容易实现。我们来看下面的例子 这个例子中,我们在package级别定义了一个变量,名称为test 然后,我们在数据流中有一个script component,我们尝试在里面对上面这个变量进行读写 代码大致如下 usingsystem;usingsystem.data;usingmicrosoft.sqlserver.dts.pipeline.wrapper;usingmicrosoft.sqlserver.dts.runtime.wrapper;usingsystem.windows.forms; [microsoft.sqlserver.dts.pipeline.ssisscriptcomponententrypointattribute]publicclassscriptmain : usercomponent{publicoverridevoidpreexecute(){base .preexecute();}publicoverridevoidpostexecute(){base .postexecute();}publicoverridevoidinput0_processinputrow(input0buffer row){messagebox.show(variables.test.tostring());}} 代码很简单,也很自然。我只是作为演示,这里读取到那个变量之后,显示出来。 但是这个代码是不能运行的,有如下错误 上述错误的意思是,除非在postexecute方法里面,是不可以对变量进行读写的。这里的原因是,processinputrow这个方法,因为是每一行数据都会执行一次,所以如果这里随意读写变量的话,会因为要频繁加锁和解锁,造成效率方面的问题。 如果你理解了上述机制,而且也确定可以承担锁定可能带来的性能损耗,那么要解决问题,可以通过如下的方式实现publicoverridevoidinput0_processinputrow(input0buffer row){ variabledispenser.lockforread( "user::test");//这里先声明对某个变量进行锁定 idtsvariables100 vs =null;this .variabledispenser.getvariables(outvs);//通过variabledispenser获取变量集合 messagebox.show(vs["user::test"
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
银行卡和银行存折哪个更安全?
冲腾的意思是什么?冲腾的释义是什么啊?
现金流量折现法对公司估值的问题。
捷利的意思是什么?捷利的释义是什么啊?
春节,盈盈家请客喝酒……
官桥的意思是什么啊?请解释下!
找一个以风字开头的5个字的成语 要有霸气的
难拚的意思是什么?难拚的释义是什么啊?
我在威海摩托车没有驾驶证,有牌照和行车证交
驯象的意思是什么?驯象的释义是什么啊?
爱彼皇家橡树离岸型1比1n〇〇b厂完美版
梦幻玩新区
玉笺的意思是什么啊?请解释下!
翰林学堂(河源连平县)地址在什么地方,想过去
北川凉粉醋水配料比例,放什么香料。
推荐资讯
蒲江到名山快速通道土地赔偿多少钱一
扬子冰箱和海尔冰箱相对比较哪个好一点
彼时豆蔻好看吗,我只买到凉夏之年,买不到彼
伏臈的意思是什么啊?请解释下!
苹果7上滑怎么不显示飞行模式
在潍坊服务区可不可以坐到黄岛的车。。。木有
那个有小说《婆婆来了》的结局呀
如何推动两岸经济合作
龙盛娱乐节目主管哪些?
谁有写给对象回忆之类的文章阿
收到手捧花真的会找到另一半吗?
现在的美帝和当年的英帝 哪个更霸道
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?