2017-04-10 79 views
0

我知道這可能看起來像一個常見問題,但我有一個獨特的情況,我無法找到答案。SSIS OLE DB命令元數據錯誤,因爲數據庫觸發

我有一個簡單的SSIS包,我想用它來更新Excel電子表格中的表格。我將使用執行存儲過程的OLE DB命令任務執行此操作。但是,它不檢索要映射的任何列名稱。錯誤與此類似:

無法確定元數據,因爲語句'insert into #TempTable ...'使用臨時表。'

我明白爲什麼它會返回此錯誤並知道典型的解決方法。但是,錯誤不是來自程序包調用的存儲過程。該proc不使用臨時表。這是更新觸發數據庫觸發器的結果,該觸發器調用另一個proc,它使用臨時表。

不幸的是,觸發的proc導致的錯誤是來自我正在開發的第三方應用程序,無法修改。

有誰知道一個解決方案,不涉及添加代碼到違規proc?

謝謝!

回答

1

選項1,將Excel電子表格加載到臨時表中,然後使用'執行SQL任務'來更新您的最終表。 選項2,創建腳本任務,從電子表格讀取並更新您的最終表格,從而避免通過數據流進行列映射。

1

最好的辦法是將更新轉移到專用表(OLE DB Destination),然後執行一個執行SQL任務作爲後繼事件。

在執行SQL任務中,設置一個遊標來分段暫存表,然後調用存儲過程。

DECLARE CSR CURSOR 
READ_ONLY 
FOR SELECT Col1, Col2 
FROM staging; 

DECLARE @Col1 nvarchar(100) 
, @Col2 nvarchar(100); 
OPEN CSR; 

FETCH NEXT FROM CSR INTO @Col1, @Col2; 
WHILE (@@fetch_status <> -1) 
BEGIN 
    IF (@@fetch_status <> -2) 
    BEGIN 
     EXECUTE dbo.MyProcedure @Col1, @Col2; 
    END 
    FETCH NEXT FROM CSR INTO @Col1, @Col2; 
END 

CLOSE CSR; 
DEALLOCATE CSR; 
0

我發佈了這個臨時表的方法發生在我身上,這是我一起去的路線。雖然對於這樣一個簡單的軟件包並不理想,但它確實有效。遊標甚至不是必需的......對於這個包,我可以簡單地從暫存表中更新適當的表,不需要存儲過程。感謝你們兩位!