[SSIS] Microsoft OLEDB for Oracle and SQL Command with Parameters Issue

之前在設定與 Oracle 轉檔時,使用 Microsoft OLEDB for Oracle ,當要使用參數傳入時,卻出現以下訊息:

Parameters cannot be extracted from the SQL command. The provider might not help to parse parameter information from the command. In that case, use the "SQL command from variable" access mode, in which the entire SQL command is stored in a variable.

提供者無法衍生參數資訊且 SetParameterInfo 未被呼叫。 (Microsoft OLE DB Provider for Oracle)


在 DataFlow 的 OLE Source 中,Build Query 都是成功的,但是要按下 Paramenters 按鈕時,就會出現這些問題。


select * from MichaelData where StartDT between :sdt and :edt


  • 移至 Control Flow 頁籤中,設定變數 string temp_insert_sql , string startYMD , string endYMD
    並點選變數視窗中的 temp_insert_sql 變數(很重要,我也找了好久),按下 F4 跳出內容視窗,在 Expression 輸入
    "SELECT * FROM  MichaelData WHERE StartYMD BETWEEN '"+ @[User::startYMD] +"' AND '"+ @[User::endYMD] +"') and ....."
  • 新增一個 Scripting Task,在執行 DataFlow 之前,用來填入 sql command,進入 Edit 時,輸入 ReadWriteVariables = strYMD,endYMD
  • 再點入下方 Design Script...
    Dim bt(0) As Byte
    If Dts.Variables("startYMD").Value.ToString() = "" Or Dts.Variables("endYMD").Value.ToString() = "" Then
        Dts.Variables("startYMD").Value = DateTime.Now.AddDays(-7).ToString("yyyyMMdd")
        Dts.Variables("endYMD").Value = DateTime.Now.ToString("yyyyMMdd")
    End If
    Dts.Log("startYMD:" & DateTime.Now.AddDays(-7).ToString("yyyyMMdd"), 0, bt)
    Dts.Log("endYMD:" & DateTime.Now.ToString("yyyyMMdd"), 0, bt)
    Dts.TaskResult = Dts.Results.Success
  • 這樣子 Scripting Task 就完成了,可以再回頭來做 DataFlow 中的 OLE Source 設定


這樣子就 OK 囉,不會出錯了。

1 則留言:

匿名 提到...


是把整段sql都當參數, 組好再傳啊..

多謝囉 XD