2012-11-02 64 views
1

在SSIS組件OLE DB命令:SSIS錯誤:插入值列表不匹配列列表

insert into D_MAPPING_CLIENTS (ID, DIRECTORY_ID, SOURCE_ID, BASE_ID) 
    values (

    case when exists (select 1 from D_MAPPING_CLIENTS) 
      then (select MAX(ID) + 1 from D_MAPPING_CLIENTS) 

     else 1 
    end 

    , ISNULL(?, 
     case when exists (select 1 from D_MAPPING_CLIENTS) 
      then (select MAX(DIRECTORY_ID) + 1 from D_MAPPING_CLIENTS) 

      else 1 
     end) 

    , (select ID from D_SOURCES_CLIENTS where SOURCE = 'D:\load\1\clients.txt') 

    , ?) 

當我試圖挽救它,我得到一個錯誤:「插入值列表不匹配列列表',雖然當我在Management Studio中運行此腳本時,它工作正常。

有什麼問題?

UPD:我在哪裏取代最後的'?'到一些價值,它工作正常:Ø

+0

我已經將最後一個參數替換爲第一個posititon,這將起作用。我很困惑:[ – user1733773

回答

1

您遇到的問題是兩件事之一的結果。您可能沒有在執行SQL任務中設置參數映射,或者在同一任務的設置中未設置BypassPrepare設置,這很可能是這種情況。

我設法重新創建錯誤,並繞過它。我遵循的步驟如下:

  1. 重新創建您的數據庫與您的查詢中指定的那兩個表。使用硬編碼值對其進行測試,以確定它的工作原理。
  2. 在我的包中添加了兩個變量 - BaseID & DirectoryID並給它們一些默認值。
  3. 創建SQL執行任務並將您的查詢添加到SQLStatement
  4. 走到參數映射和映射兩個變量指定的 & 參數名。 此時我的BypassPrepare選項設置爲False,運行該任務導致您收到確切的錯誤。
  5. BypassPrepare選項設置爲True。執行任務導致成功並將一行添加到數據庫中,沒有任何問題。

有關該特定屬性信息(在不同上下文中使用,但是具有相同的通用功能)見:http://technet.microsoft.com/en-us/library/microsoft.sqlserver.dts.tasks.executesqltask.executesqltask.bypassprepare.aspx


UPDATE

給出的解決方案是一個SQL執行任務,而不是OLE DB命令。改變'?'的位置OP所述SQL查詢中的值參數解決了這個問題。

另一種選擇是重新調用存儲過程。

+0

但是我的聲明不是SQL執行任務,它是數據流任務中的OLE DB命令** – user1733773

+0

哦,在這種情況下,數據流任務的來源是什麼?您是否在OLE DB命令屬性中指定了正確的列映射? –

+0

列映射是正確的。我在開始時移動所有參數,現在它工作正常。我不知道爲什麼它不起作用 – user1733773