Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ssis包中不同容器中exec sql任务中的引用系统变量_Ssis_Teradata_Bids_Sql Server Data Tools - Fatal编程技术网

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

ssis包中不同容器中exec sql任务中的引用系统变量,ssis,teradata,bids,sql-server-data-tools,Ssis,Teradata,Bids,Sql Server Data Tools,我需要将大约40个平面文件加载到40个不同的表中,并在加载后将每个文件记录到统计表中。我将我的任务命名为与表名匹配的任务,并创建了onPostExecute事件,每个事件中都有一个execSQL任务(它们都是我首先创建的任务的副本) 我在包作用域中有一个变量,包含我要执行的SQL,包括对系统变量@[system::SourceName]的引用: "INSERT INTO db.TableStatsHistory SELECT * FROM db.TableStats WHERE TABLENAM

我需要将大约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变量的“作用域”的概念,但是我看到的示例说在包级别创建用户变量。如果我首先单击事件中的任务,然后打开变量的表达式窗口,它的计算结果就很好

我希望我不必在每个作用域中创建多个变量和/或任务来实现这一点,我只希望SQL语句位于每个数据流任务的onPostExecute事件引用的一个位置,但是我读了

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

谢谢你的帮助

-贝丝

如果我在postExecute作用域中为每个ExecSQLTask和完全相同的表达式创建一个具有不同路径的变量,我可以让它工作,但是如果有更好的方法在事件中跨任务引用表达式,请让我知道

谢谢

我还尝试使用如下值参数化executeSQL任务sqlStatementSource变量

     DELETE FROM db.TableStatsHistory WHERE TABLENAME = '@[System::SourceName]' 
and LastUpdated = CURRENT_DATE; 
但这也不起作用。它不会像在任务中创建参数时那样给我一个“参数不匹配”错误,但它的行为就像系统变量值为空或null一样

基本上,我想要一个与带参数的SQLServer存储过程等效的方法,但我认为Teradata没有类似的方法。我现在想,我应该将SQL存储在Teradata上的一个表中,并使用嵌入的参数令牌查找要执行的SQL。

问题在于使用“System::SourceName”。其范围与包装设计不兼容。
不确定您是如何设计包的,但适当的修复方法可能是创建一个用户(包级别)变量,该变量获取“System::SourceName”的值,然后您可以在PostExecute事件中使用它

是的。我有一个包含系统变量的用户变量(包级别)。我在onPostExecute事件中调用它。您的建议与我的建议有何不同?SSIS表达式参数化执行SQL任务的正确语法是“从db.tableStatsStory删除,其中TABLENAME=”+@[System::SourceName]+“,LastUpdated=CURRENT_DATE;”我让它工作,但不是我想要的方式,因为我必须在onPostExecute事件的40个不同级别创建80个变量。语法不是问题,我试图为40个不同的表值执行相同的SQL。现在,我将SQL块放在一个地方,我还将考虑使用如下值参数化SQLStatementSource变量的执行SQL任务
     DELETE FROM db.TableStatsHistory WHERE TABLENAME = '@[System::SourceName]' 
and LastUpdated = CURRENT_DATE;