将文件名传递给SSIS中的执行SQL任务

问题描述:

我正在设置一个SSIS包,它接受一个平面文件并将其内容加载到临时表中。从那里它需要获取该文件的文件名并将其保存到另一个表中的字段以及其中一行数据。我通过使用执行SQL任务来执行存储过程来加载数据。此过程使用的文件名作为输入参数(只是这样我就可以把它写入到表)......我增加了执行SQL任务前的脚本任务执行以下操作:将文件名传递给SSIS中的执行SQL任务

public void Main() 
     { 
      string inputFolder; 
      string fileName; 

      inputFolder = Dts.Variables["SourceFolder"].Value.ToString(); 
      // MessageBox.Show(inputFolder); 

      string[] foundFiles = null; 
      foundFiles = System.IO.Directory.GetFiles(inputFolder); 

      if (foundFiles.Length > 0) 
      { 
       fileName = foundFiles[0]; 

       Dts.Variables["ProcessedFileName"].Value = System.IO.Path.GetFileName(fileName); 
//    MessageBox.Show(fileName); 

       // MessageBox.Show(System.IO.Path.GetFileName(fileName)); 

      } 

      Dts.TaskResult = (int)ScriptResults.Success; 
     } 

的“ProcessedFileName”变量是SSIS包中的全局变量,以及“SourceFolder”变量。

执行SQL任务我设置使用执行直接输入:

DECLARE @StoredProcedure varchar(100) = ?; 
DECLARE @ProcessedFileName varchar(100) = ?; 

EXEC ? ?; 

参数映射到变量StoredProcedure的和ProcessedFileName。

问题是,当我运行它时,它告诉我“没有给出一个或多个必需参数的值”。为什么会这样呢?

您不能使用参数动态更改执行SQL任务中的存储过程名称。这就是EXEC ? ?;正在做的事情。

如果您需要在运行时更改过程名称,那么您将需要通过表达式使用字符串连接来构建我们的查询。

更大的图片,看起来您正在使用脚本任务,其中For Each (file) Enumerator任务就足够了。有理由使用foreach的脚本任务(比如,如果你需要按顺序处理等),但它不会像你正在做的那样阅读。

什锦答案可能帮助就如何完成表达式和foreach枚举