2012-07-26 75 views
1

我正在設置一個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。

問題是,當我運行它時,它告訴我「沒有給出一個或多個必需參數的值」。爲什麼會這樣呢?

回答

1

您不能使用參數動態更改執行SQL任務中的存儲過程名稱。這就是EXEC ? ?;正在做的事情。

如果您需要在運行時更改過程名稱,那麼您將需要通過表達式使用字符串連接來構建我們的查詢。

更大的圖片,看起來您正在使用腳本任務,其中For Each (file) Enumerator任務就足夠了。有理由使用foreach的腳本任務(比如,如果你需要按順序處理等),但它不會像你正在做的那樣閱讀。

什錦答案可能幫助就如何完成表達式和foreach枚舉