SSIS包不想获取临时表的元数据

Mor*_*ana 28 sql sql-server ssis ssis-2012

我有一个SSIS包,其中包含多个流.

每个流程都负责创建一个"临时"表,该表在创建后填满.这些表是全局临时表.

对于另一个表,我添加了一个额外的流程(我没有制作包),其完全如上所述.但是,出于某种原因,程序包在此流程上间歇性地失败,而除了一些表名之外,它与其他程序完全相同.

弹出的错误:

更新 - 插入数据流:错误:SSIS错误代码DTS_E_OLEDBERROR.发生OLE DB错误.错误代码:0x80004005.OLE DB记录可用.来源:"Microsoft SQL Server Native Client 11.0"Hresult:0x80004005描述:"未指定的错误".OLE DB记录可用.来源:"Microsoft SQL Server Native Client 11.0"Hresult:0x80004005描述:"无法确定元数据,因为语句'select*from'## TmpMcsConfigurationDeviceHistory86B34BFD041A430E84CCACE78DA336A1''使用临时表."

创作表达:

"CREATE TABLE " + @[User::TmpMcsConfigurationDeviceHistory]  + " ([RecId] [bigint] NULL,[DataAreaID] [nvarchar](4) COLLATE database_default NULL,[Asset] [bigint] NULL,[Code] [nvarchar](255) COLLATE database_default NULL,[Configuration] [bigint],[StartdateTime] [datetime] NULL,[EndDateTime] [datetime] NULL)
Run Code Online (Sandbox Code Playgroud)

"

解析表达式(=已评估):

CREATE TABLE ##TmpMcsConfigurationDeviceHistory764E56F088DC475C9CC747CC82B9E388 ([RecId] [bigint] NULL,[DataAreaID] [nvarchar](4) COLLATE database_default NULL,[Asset] [bigint] NULL,[Code] [nvarchar](255) COLLATE database_default NULL,[Configuration] [bigint],[StartdateTime] [datetime] NULL,[EndDateTime] [datetime] NULL)
Run Code Online (Sandbox Code Playgroud)

AHi*_*ins 40

使用WITH RESULT SETS显式定义元数据将允许SSIS跳过该sp_describe_first_result_set步骤并使用您定义的元数据.好处是你可以使用它来让SSIS执行包含临时表的SQL(对我来说,这个性能有很大帮助); 缺点是,如果有任何变化,你必须手动维护和更新它.

查询示例(存储过程:)

    EXEC ('dbo.MyStoredProcedure')
    WITH RESULT SETS
      (
        (
            MyIntegerColumn INT NOT NULL,
            MyTextColumn VARCHAR(50) NULL,
            MyOtherColumn BIT NULL
        )
      )
Run Code Online (Sandbox Code Playgroud)

查询示例(简单SQL :)

EXEC ('
    CREATE TABLE #a 
      (
        Col INT
      ) 
    INSERT INTO #a 
      (
        COL
      )
    SELECT 1 AS Col

    SELECT Col 
    FROM #a')
WITH RESULT SETS ( (Col INT NOT NULL))
  )
Run Code Online (Sandbox Code Playgroud)

  • 这个答案对我有用.使用FMTONLY命令的上述答案最终在实际ETL期间向输出发送0行. (2认同)

Kyl*_*ale 15

另一种选择(一种黑客,但它的工作原理并且不需要你改变你对全局临时表的使用)是在你的实际查询前使用一个SET FMTONLY ON命令来发送一个假的"第一个结果集"到SSIS具有正确的列结构.所以你可以做点什么

SET FMTONLY ON
select 0 as a, 1 as b, 'test' as C, GETDATE() as D
SET FMTONLY OFF

select a, b, c, d from ##TempTable
Run Code Online (Sandbox Code Playgroud)

当SSIS运行sp_describe_first_result_set时,它将返回FMTONLY命令的元数据和列名,并且不会抱怨无法确定临时表的元数据,因为它甚至都不会尝试.

  • 仅供参考:自 SQL Server 2012 以来,`SET FMTONLY` 已被弃用。 https://msdn.microsoft.com/en-us/library/ms143729(v=sql.110).aspx (2认同)

Son*_*nam 9

如果您正在使用SSIS 2012,那么它使用系统存储过程sp_describe_first_result_set来获取表的元数据,并且它不支持临时表.但你可以选择其他选项,如表变量和CTE,它们可以正常工作.https://connect.microsoft.com/SQLServer/feedback/details/629077/denali-engine-metadata-discovery-shuns-temp-tables

  • 仅供参考:通过表变量,Soram表示SQL表变量(@tables),而不是包含DDL的SSIS变量. (2认同)