2017-07-07 41 views
1

我編寫了一個存儲過程,將記錄讀入臨時表中,然後從臨時表中的數據創建一個樞軸輸出。如何從SSIS中執行存儲過程以將其輸出轉換爲文本文件

從SSMS運行存儲過程工作得很好。我現在面臨的問題是現在我正在嘗試創建將執行sproc的SSIS包,並將其輸出寫入製表符分隔的文本文件。

我正在使用Visual Studio 2015.我的第一個問題是,當我嘗試在數據流任務中配置OLE DB源時,在SQL命令文本框中添加SQL命令時:EXEC ShopperSkuHistory並單擊確定,我得到這個錯誤:

enter image description here

我一直在尋找有關此錯誤信息,但我沒有發現任何東西,可以幫助我瞭解爲什麼發生這種情況,我怎麼能解決這個問題。

我希望通過這篇文章,我可以學習如何解決這個錯誤。

非常感謝您提前。

這裏是我的存儲過程:

更新的代碼

ALTER PROCEDURE [dbo].[ShopperSkuHistory] 

AS 
BEGIN 

     IF OBJECT_ID('tempdb..[#ShopperSku_History_Load]') IS NOT NULL 
       BEGIN 
         DROP TABLE [#ShopperSku_History_Load]; 
       END;   

     -- Create main table 
     CREATE TABLE [#ShopperSku_History_Load] 
     (
      [ID]         INT IDENTITY(1, 1) NOT NULL 
     , [shopper_id] CHAR(32) NOT NULL 
     , [sku]        VARCHAR(100) NOT NULL      
     , time_added DATETIME  
     )  

     SET NOCOUNT ON; 

     -- Populate the table 
     INSERT INTO [#ShopperSku_History_Load] ([shopper_id], [sku], [time_added])  
     SELECT DISTINCT [cr].[shopper_id], LEFT([cri].[sku], 9) [sku], GETDATE() [time_added] 
     FROM [dbo].[receipt_item] [cri] 
     INNER JOIN [dbo].[receipt] [cr] 
       ON [cri].[order_id] = [cr].[order_id] 
     WHERE[cri].[list_price] > 0 
       AND [cri].[IsInitialPurchase] = 1 
       AND LEFT([cri].[sku], 3) = 'MN0' 
       AND ([cr].[date_entered] > DATEADD(YEAR, -2, GETDATE())) 
       AND EXISTS (SELECT 1 FROM [product] [cp] WHERE [cp].[pf_id] = [cri].[sku] AND [cp].[for_sale] = 1) 
       AND NOT EXISTS (SELECT 1 FROM [dbo].[shopper] [cs] WHERE [cs].[IsTesting] = 1 AND [cs].[shopper_bounce] = [cr].[shopper_id])     
     ORDER BY [shopper_id]; 

     CREATE TABLE [#HistoryOutput] 
     (
     [shopper_id] VARCHAR(32) 
     , skus TEXT 
     ) 

     INSERT INTO [#HistoryOutput] 
     ([shopper_id], [skus])   

     SELECT 
      [shopper_id] 
     , STUFF((SELECT ', ' + ISNULL([a].[sku], '') 
                  FROM [#ShopperSku_History_Load] [a] 
                  WHERE [a].[shopper_id] = [b].[shopper_id] 
                   FOR 
                     XML PATH('') 
                 ), 1, 1, '') [skus] 
    FROM [#ShopperSku_History_Load] [b] 
     GROUP BY [shopper_id]; 

    SELECT 
     [shopper_id] 
     , [skus] 
    FROM 
     [#HistoryOutput]; 

END; 

更新的誤差

Exception from HRESULT: 0xC0202009 
Error at Data Flow Task [OLE DB Source [1]]: SSIS Error Code DTS_E_OLEDBERROR. An OLE DB error has occurred. Error code: 0x80040E14. 
An OLE DB record is available. Source: "Microsoft SQL Server Native Client 11.0" Hresult: 0x80040E14 Description: "Statement(s) could not be prepared.". 
An OLE DB record is available. Source: "Microsoft SQL Server Native Client 11.0" Hresult: 0x80040E14 Description: "Incorrect syntax near 'shopper_id'.". 
+0

對不起,我看不到圖像。你能將錯誤粘貼到文本中嗎? – Chuck

回答

3

此錯誤

The metadata could not be determined because statement 'EXEC XXXXXX' in procedure 'XXXXXX' contains dynamic SQL. Consider using the WITH RESULT SETS clause to explicitly describe the result set.

發生是因爲SP包含或者是

  1. 溫度表
  2. 動態SQL

由於這些動態元素,SSIS/SSDT有困難得到正確的列元數據。更多信息here。我們需要幫助SSIS獲取該列元數據。根據您的SQL Server版本,有兩種解決方案。

enter image description here

對於SSIS 2008/SQL,你可以嘗試設置FMTONLY OFF enter image description here

對於SSIS/SQL 2012,你可以從一個SSIS包RESULT SET存儲過程。試試這個...

enter image description here

其他選項包括更新存儲過程本身並添加WITH RESULTS SETS條款。或者更新存儲過程以返回表變量。

+0

嗨特洛伊,我正在使用VS/SSIS 2015和SQL 2012.我有點不確定如何更新存儲過程。添加WITH RESULTS SETS。 –

+0

我試過你的建議,不確定我是否正確。儘管有其他錯誤,但仍然會出現錯誤。我更新了我的代碼和錯誤文本。 –

+0

您的新錯誤是語法錯誤。 SP現在已經壞了。在SSMS中試試看看它是否有效。請回復它並查看我答案的更新。在SSIS中添加'RESULT SET'子句,謝謝。 –

相關問題