【问题标题】:How to EXEC a stored procedure from SSIS to get its output to text file如何从 SSIS 执行存储过程以将其输出到文本文件
【发布时间】:2017-07-07 15:28:49
【问题描述】:

我编写了一个存储过程,它将记录读入临时表,然后从临时表中的数据创建一个旋转输出。

从 SSMS 运行存储过程可以正常工作。我现在面临的问题是我正在尝试创建将执行存储过程的 SSIS 包,并将其输出写入制表符分隔的文本文件。

我正在使用 Visual Studio 2015。我的第一个问题是,当我尝试在数据流任务中配置 OLE DB 源时,在 SQL 命令文本框中添加 SQL 命令时:EXEC ShopperSkuHistory 并单击确定,我得到这个错误:

我一直在寻找有关此错误的信息,但我没有找到任何可以帮助我理解为什么会发生这种情况以及如何解决它的信息。

我希望通过这篇文章我可以学习如何解决这个错误。

非常感谢您。

这是我的存储过程:

更新代码

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'.".

【问题讨论】:

  • 对不起,我看不到图片。你能把错误粘贴到文本中吗?

标签: sql-server stored-procedures ssis sql-server-2012


【解决方案1】:

这个错误

无法确定元数据,因为语句 'EXEC 过程 'XXXXXX' 中的 XXXXXX' 包含动态 SQL。 考虑使用 WITH RESULT SETS 子句明确描述 结果集。

发生是因为 SP 包含一个

  1. 临时表
  2. 动态 SQL

由于这些动态元素,SSIS/SSDT 无法正确获取列元数据。更多信息here。我们需要帮助 SSIS 获取该列的元数据。根据您的 SQL Server 版本,有两种解决方案。

对于 SSIS/SQL 2008,您可以尝试设置FMTONLY OFF

对于 SSIS/SQL 2012,您可以使用来自 SSIS 的 RESULT SET 包装存储过程。试试这个...

其他选项包括更新存储过程本身和添加WITH RESULTS SETS 子句。或者更新存储过程以返回一个表变量。

【讨论】:

  • 嗨 Troy,我正在使用 VS/SSIS 2015 和 SQL 2012。我有点不确定如何更新存储过程。添加 WITH RESULTS 集。
  • 我尝试了你的建议,不确定我是否做得对。尽管有不同的错误,但仍然会出现错误。我已经更新了我的代码和错误文本。
  • 您的新错误是语法错误。 SP现在坏了。在 SSMS 中尝试一下,看看它是否有效。请恢复它并查看我的答案的更新。在 SSIS 中添加RESULT SET 子句,谢谢。
  • [shopper_id] CHAR(32)..这有效吗?用 VARCHAR 替换 CHAR 并运行你的 sp。
  • @TroyWitthoeft:使用来自 SSIS 的 RESULT SET 包装存储过程确实解决了我的问题,现在我可以运行具有预期结果的包。非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-03
  • 1970-01-01
  • 2013-11-25
  • 1970-01-01
  • 2015-01-15
  • 1970-01-01
相关资源
最近更新 更多