我已经成功部署了许多SSIS包(在SQL Server 2008 R2中)。临时表在SSIS中立即丢弃
我发现了一个困扰我的问题。检查基本的下列流程。
在“下载文件从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,所以这是明确的修复。
为什么要截断临时表?为什么它也是一个全球临时表? – gbn 2015-02-11 13:23:35
您必须在SSIS中使用全局临时表。如果您怀疑我,请阅读整个博客:http://www.mssqltips.com/sqlservertip/2826/how-to-create-and-use-temp-tables-in-ssis/。此外,我正在截断临时表,因为我用每个文件的数据加载它。 – Anonymouse 2015-02-11 13:33:21
我会在wrk架构中使用持久表。我根本不会使用临时表。例如:如果我正在加载Data.Foobar,我将有用于分级数据的wrk.foorbar。我不会使用## foobar ... – gbn 2015-02-11 13:55:59