在SSIS中使用临时表

Jas*_*n M 8 ssis sql-server-2008 visual-studio-2008

我在SQL Server中的存储过程中使用临时表.我试图在OLE DB源代码编辑器中使用该SP.

我可以看到在Build Query按钮附带的Query Builder中返回的数据输出.但是,当我单击列选项卡时,我收到以下错误.

- TITLE:Microsoft Visual Studio

数据流任务错误[OLE DB源[1]]:SSIS错误代码DTS_E_OLEDBERROR.发生OLE DB错误.错误代码:0x80004005.OLE DB记录可用.来源:"Microsoft SQL Server Native Client 10.0"Hresult:0x80004005描述:"无效的对象名称'## Payment'.".

数据流任务出错[OLE DB源[1]]:无法从数据源检索列信息.确保数据库中的目标表可用.

这是否意味着我不能在SP中使用临时表,如果我希望它被SS​​IS使用

Hen*_*sen 15

http://sqlserverpedia.com/blog/sql-server-bloggers/ssis-stored-procedure-metadata/中提到了另一种解决方案.看看选项3.

Quote:使用"shortircuited if子句"(如果1 = 0)将一些元数据和"set nocount on"添加到存储过程,并在顶部添加伪造的select语句.我已经测试过试图将"设置nocount"打开并且它不起作用.

CREATE PROCEDURE [dbo] . [GenMetadata] AS 
SET NOCOUNT ON 
IF 1 = 0 
    BEGIN
         -- Publish metadata 
        SELECT   CAST (NULL AS INT ) AS id , 
                CAST (NULL AS NCHAR ( 10 )) AS [Name] , 
                CAST (NULL AS NCHAR ( 10 )) AS SirName 
    END 

 -- Do real work starting here 
CREATE TABLE #test 
    ( 
      [id] [int] NULL, 
      [Name] [nchar] ( 10 ) NULL, 
      [SirName] [nchar] ( 10 ) NULL 
    ) 
Run Code Online (Sandbox Code Playgroud)


Jas*_*n M 8

我用了

在程序开始时设置FMTONLY OFF,这将告诉在没有执行时不向客户端处理行,因为在解析SP时没有临时表,因此在解析时没有可用的列.

它让我终于工作了:)


Reg*_*ser 5

如果在BIDS中引发错误,则ajdams解决方案将无法工作,因为它仅适用于从SQL Server代理运行包时引发的错误.

主要问题是SSIS正在努力解决元数据.从它的立场来看,##表不存在,因为它不能在预执行阶段返回对象的元数据.所以你必须找到一种方法来满足表已经存在的要求.有几个解决方案:

  1. 不要使用临时表.而是创建一个工作数据库并将所有对象放入其中.显然,如果您试图在服务器上获取数据而不是像生产服务器这样的dbo,这可能不会起作用,因此您不能依赖此解决方案.

  2. 使用CTE而不是临时表.如果源服务器是2005/2008,则此方法有效.如果源服务器是2000,这将无济于事.

  3. 在单独的Execute SQL命令中创建##表.将连接的RetainSameConnection属性设置为True.将DelayValidation设置为true以表示数据流.设置数据流时,通过临时将SELECT TOP 0字段= CAST(NULL AS INT)添加到存储过程的顶部来伪造它,该存储过程具有与最终输出相同的元数据.在运行程序包之前,请记住从存储过程中删除它.这也是在数据流之间共享临时表数据的便捷技巧.如果您希望包的其余部分使用单独的连接以便它们可以并行运行,那么您必须创建一个额外的非共享连接.这避免了问题,因为临时表在数据流任务运行时已经存在.

选项3实现了您的目标,但它很复杂,并且您必须将create ##命令分隔到另一个存储过程调用中.如果您能够在源服务器上创建存储过程,那么您可能还可以创建其他对象(如登台表),这通常是更好的解决方案.它还可以侧重步骤可能的TempDB争用问题,这也是一个理想的好处.

祝您好运,如果您需要有关如何实施第3步的进一步指导,请告诉我.