gpt4 book ai didi

sql-server - 如何从 SSIS 执行存储过程以将其输出到文本文件

转载 作者:行者123 更新时间:2023-12-04 02:23:08 24 4
gpt4 key购买 nike

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

从 SSMS 运行存储过程工作正常。我现在面临的问题是,我正在尝试创建将执行存储过程的 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'.".

最佳答案

这个错误

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/SQL 2008,您可以尝试设置 FMTONLY OFF enter image description here

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

enter image description here

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

关于sql-server - 如何从 SSIS 执行存储过程以将其输出到文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44974563/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com