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)
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命令的元数据和列名,并且不会抱怨无法确定临时表的元数据,因为它甚至都不会尝试.
如果您正在使用SSIS 2012,那么它使用系统存储过程sp_describe_first_result_set来获取表的元数据,并且它不支持临时表.但你可以选择其他选项,如表变量和CTE,它们可以正常工作.https://connect.microsoft.com/SQLServer/feedback/details/629077/denali-engine-metadata-discovery-shuns-temp-tables