2008/01/24

[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
    SNAG-01-24-01
  • 再點入下方 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 設定
    SNAG-01-24-02

 

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

1 則留言:

匿名 提到...

感動啊...
試了半天總算試出來了

原來傳參數給Oracle的方式
是把整段sql都當參數, 組好再傳啊..

多謝囉 XD