在ssis包中的不同容器中的exec sql任务中引用系统变量

时间:2015-05-15 21:37:30

标签: ssis teradata bids sql-server-data-tools

我需要将大约40个平面文件加载到40个不同的表中,并在加载后将每个文件记录到统计表中。我将我的任务命名为匹配表名,并在每个事件中创建onPostExecute事件和execSQL任务(它们都是我首先创建的任务的副本。)

我在包范围内有一个包含我想要执行的SQL的变量,包括对系统变量@ [System :: SourceName]的引用:

"INSERT INTO db.TableStatsHistory SELECT * FROM db.TableStats WHERE TABLENAME = '" + @[System::SourceName] + "'; " + 
"DELETE FROM db.TableStats WHERE TABLENAME = '" + @[System::SourceName] + "'; " +
"INSERT INTO db.TableStats 
 SELECT t.tname ,CURRENT_DATE ,rcnt ,sum_currentPerm  FROM
 (SELECT databasename, TABLENAME AS tname FROM dbc.TablesV) t INNER JOIN
 (SELECT databasename, TABLENAME AS tname, SUM(currentPerm) AS sum_currentPerm FROM dbc.TableSize GROUP BY 1,2 ) ts ON
 t.databasename = ts.databasename AND t.tname = ts.tname INNER JOIN
 (SELECT '" + @[System::SourceName] + "' AS tname, COUNT(*) AS rcnt FROM db." + @[System::SourceName] + ") u ON
 t.tname = u.tname WHERE  t.databasename = 'db' AND t.tname = '" + @[System::SourceName] + "'"

当我只有一个任务启用了开发时,它运行正常,但现在我已将该任务粘贴到其他39个onPostExecute事件中,它说:

    Error: The variable "System::SourceName" was not found in the Variables collection. 
The variable might not exist in the correct scope.

我对SSIS变量的“范围”概念并不是很清楚,但我见过的例子说是在包级别创建用户变量。如果我首先单击事件中的任务然后打开变量的表达式窗口,它的评估就可以了。

我希望我不必在每个范围内创建多个变量和/或任务来使其工作,我只想在每个数据流任务的onPostExecute事件引用的一个地方使用SQL语句,但我读过here

Scope

You can change this property setting only by clicking Move Variable in the Variables window.
A variable is created within the scope of a package or within the scope of a container, task, 
or event handler in the package. Because the package container is at the top of the container 
hierarchy, variables with package scope function like global variables and can be used by all 
containers in the package.

那为什么包找不到系统变量?

感谢您的帮助,

-Beth

如果我在postExecute范围创建一个变量,并为每个ExecSQLTask和完全相同的表达式创建一个不同的路径,我可以使它工作,但是如果有更好的方法在事件中的任务中引用表达式,请告诉我

感谢。

我也试图使用类似

的值来参数化sql任务sqlStatementSource变量
     DELETE FROM db.TableStatsHistory WHERE TABLENAME = '@[System::SourceName]' 
and LastUpdated = CURRENT_DATE; 

但这也不起作用。它不会给我一个“参数不匹配”错误,就像我在任务中创建一个参数一样,但它的行为就好像系统变量值为空或为空。

基本上,我想要一个等效于带有参数的SQL Server存储过程的方法,但我不认为Teradata有这样的东西。我现在想的是我应该将SQL存储在Teradata上的表中,并查找SQL以使用嵌入式参数令牌执行。

1 个答案:

答案 0 :(得分:0)

拥有" System :: SourceName"是问题。它的范围与包的设计不兼容。 不确定你是如何设计你的软件包的,但是一个适当的修复可能是创建一个User(包级别)变量,它获得" System :: SourceName"的值。然后你可以在PostExecute事件中使用它。