在SSIS包中使用临时表

6

我有一个问题 - 我想在SQL Server的存储过程中使用临时表,这个存储过程将从SSIS包中执行。 我读了一些关于如何实现的技巧,我尝试了第一个答案提供的方法: Using Temp tables in SSIS,但它没有起作用。 我使用的是MS Visual Studio 2010,这个版本会有问题吗? 下面是我的存储过程代码:

CREATE PROCEDURE some_procedure      
AS
SET NOCOUNT ON
IF 1 = 0
BEGIN
  SELECT CAST(NULL AS int) as number
END
CREATE TABLE #some_table (number int)
INSERT INTO #some_table VALUES (250)
SELECT number FROM #some_table

感谢任何建议或经验。

以下是来自Visual Studio的错误消息:

Data Flow Task [OLE DB Source [1]]中的错误:SSIS错误代码DTS_E_OLEDBERROR。发生了OLE DB错误。错误代码:0x80004005。OLE DB记录可用。来源:“Microsoft SQL Server Native Client 11.0” Hresult:0x80004005 描述:“由于过程'some_procedure'中的语句'INSERT INTO #some_table VALUES (250)'使用了临时表,因此无法确定元数据。”。

Data Flow Task [OLE DB Source [1]]中的错误:无法从数据源检索列信息。确保数据库中的目标表可用。


你在获取元数据时遇到了问题吗?如果是这样,你需要在设计中设置SET FMTONLY ON来获取元数据,然后在设计完成后将其删除以获取数据。这里有使用FMTONLY获取元数据的信息 - Tak
2个回答

11

在SQL Server 2012中,如果您使用临时表,必须指定结果集。

这是SSIS使用的sp_describe_first_result_set过程返回输出元数据时遇到的问题。

例如:

EXEC dbo.RptResults_StoredProcedure
成为
EXEC dbo.RptResults_StoredProcedure
WITH RESULT SETS
((
    Date NVARCHAR(10),
    Location VARCHAR(12),
    Department CHAR(1),
    Shift CHAR(1),
    ForecastSales DECIMAL(18,2),
    ActualSales DECIMAL(18,2)
))

了解更多信息,请查看:

http://blog.concentra.co.uk/2014/08/22/column-metadata-determined-correctly-ssis-data-flow-task-stored-procedure-inputs/


4

你可以使用表变量或公用表表达式,而不是临时表...这两种方法没有临时表的问题。

CREATE PROCEDURE some_procedure      
AS
SET NOCOUNT ON

Declare @some_table TABLE (number int)
INSERT INTO @some_table VALUES (250)
SELECT number FROM @some_table

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接