2015-02-11 68 views
0

我已经成功部署了许多SSIS包(在SQL Server 2008 R2中)。临时表在SSIS中立即丢弃

我发现了一个困扰我的问题。检查基本的下列流程。

enter image description here

在“下载文件从FTP”我拿起新的文件,我需要进行操作,并将它们下载到本地驱动器,节省了拿起文件,这样他们就可以在过程中的每个迭代File foreach容器。

在“创建临时表”我创建一个临时表这样:

IF not exists (SELECT * FROM tempdb.dbo.sysobjects WHERE name='##tempProcessFiles' and xtype='U') 
CREATE TABLE ##tempProcessFiles 
(
--my columns 
) 
GO 

在“截断临时表”我这样做:

TRUNCATE TABLE ##tempProcessFiles 

基本上,我拿起一些文件,创建一个临时表,然后遍历每个文件,将必要的垃圾加载到我的数据库中。为了确保一切顺利运行,我在每次迭代时截断临时表,以便使用新表。在这个包的最后一步,我放下临时表。我也放弃临时表OnError。

问题是,当我安排这个人时,创建临时表执行得很好,但一旦达到'截断临时表',它就会抛出一个异常,说临时表不存在。具体来说:

Executing the query "TRUNCATE TABLE ##tempProcessFiles" failed with the following error: "Cannot find the object "##tempProcessFiles" because it does not exist or you do not have permissions.". Possible failure reasons: Problems with the query, "ResultSet" property not set correctly, parameters not set correctly, or connection not established correctly.

在调试模式下运行此包不会重新创建此方案。一切正常。

我发现(经过多日的挫折,追逐发送给我的观点),通过删除'创建临时表'中的GO语句,我的包将正常执行。

确定我的临时表没有错误或没有意外掉落。另外,我像永远一样坚持把安全信息设置为false,延迟验证设置为像往常一样真实;但我的下降临时表任务没有解雇 - 我甚至试图在禁用它的情况下部署它。我的其他软件包没有使用这个全局临时表,并且数据库没有任何计划任务或触发器丢弃它或任何可笑的事情。

我可以确定的是,这里的GO运算符导致我的会话到数据库终止,并导致我的临时表立即被删除。 GO运营商是如何在SSIS中工作的?如果我要在SQL Server上使用与我在包中相同的语法运行脚本,那么我肯定不会遇到这种情况,所以它会引发我进行循环。但我不是DBA,所以它可能是这个领域工作的根本或微妙之处。

任何人都可以解释这里发生了什么吗?或者我需要提供更多关于我的软件包的详细信息以获得足够的答案?我做的唯一改变是从'创建临时表'中删除GO,所以这是明确的修复。

+0

为什么要截断临时表?为什么它也是一个全球临时表? – gbn 2015-02-11 13:23:35

+0

您必须在SSIS中使用全局临时表。如果您怀疑我,请阅读整个博客:http://www.mssqltips.com/sqlservertip/2826/how-to-create-and-use-temp-tables-in-ssis/。此外,我正在截断临时表,因为我用每个文件的数据加载它。 – Anonymouse 2015-02-11 13:33:21

+0

我会在wrk架构中使用持久表。我根本不会使用临时表。例如:如果我正在加载Data.Foobar,我将有用于分级数据的wrk.foorbar。我不会使用## foobar ... – gbn 2015-02-11 13:55:59

回答

0

尽管有RetainSameConnection,但似乎连接仍在丢失。 要收集更多信息,请尝试以下操作:

在执行包时确认上述操作(添加安全审计>登录/注销和会话>现有连接)。注意StartTime和EndTime,也许它会像30s(默认命令超时)那样有趣?

然后尝试仅使用Crate和Truncate任务运行此程序包(不使用循环)以消除其他组件干扰的可能性(使用相同Connection Manager的数据源?)。如果有效,请尝试使用循环,但仅在内部放置截断任务,并继续添加其他组件。

+0

我会试试这个,这不是一个坏主意,因为我确实想知道发生了什么。谢谢。 – Anonymouse 2015-02-11 20:08:55