我已经成功部署了许多SSIS包(在SQL Server 2008 R2中)。
我发现了一个困扰我的问题。检查以下基本流程。
从FTP下载文件'我拿起我要操作的新文件并将它们下载到我的本地驱动器,保存拾取的文件,以便可以在Process Each File foreach容器中迭代它们。
在'创建临时表'我正在创建一个临时表:
IF not exists (SELECT * FROM tempdb.dbo.sysobjects WHERE name='##tempProcessFiles' and xtype='U')
CREATE TABLE ##tempProcessFiles
(
--my columns
)
GO
In'截断临时表'我在做:
TRUNCATE TABLE ##tempProcessFiles
基本上,我拿起一些文件,创建一个临时表,然后遍历每个文件,将必要的垃圾加载到我的数据库。为了确保一切顺利运行,我在每次迭代时都截断了临时表,所以我有一个新表可以使用。在这个包的最后一步,我删除临时表。我也删除了临时表OnError。
问题是,当我安排这个人时,创建临时表执行正常但是一旦它到达“截断临时表”,就会抛出一个异常,说临时表不存在。具体做法是:
执行查询" TRUNCATE TABLE ## tempProcessFiles"失败了 以下错误:"找不到对象" ## tempProcessFiles" 因为它不存在或您没有权限。"。可能 失败原因:查询问题," ResultSet"财产没有设定 正确,参数设置不正确,或连接未建立 正确。
在调试模式下运行此程序包不会重新创建此方案。一切正常。
我发现(经过多天的挫折之后,追逐那些让我圈起来的想法),通过删除“创建临时表”中的GO语句。我的包会正常执行。
确定我的临时表没有错误或没有意外删除。另外,我一直坚持将安全信息设置为false,将验证设置为始终为true;但是我的drop temp table任务没有被解雇 - 我甚至尝试将它部署,并禁用它。我的其他软件包都没有使用这个全局临时表,而且数据库没有预定的作业或触发器丢弃或类似的任何荒谬。
我可以确定的是,这里的GO运算符导致我的数据库会话终止并导致我的临时表立即被删除。这是GO运营商在SSIS中的运作方式吗?如果我使用与我的包中完全相同的语法在SQL Server上运行脚本,我绝对不会遇到这种情况,所以它抛出了我的循环。但我不是DBA,所以它可能是这个工作领域的基础或微妙之处。
谁能解释一下这里到底发生了什么?或者我是否需要提供有关我的包裹的更多细节以获得足够的答案?我做的唯一改变就是从“创建临时表”中删除GO,这是明确的修复。
答案 0 :(得分:0)
尽管RetainSameConnection
,似乎连接正在被删除。
要收集更多信息,请尝试以下操作:
在执行包时运行跟踪以确认上述内容(添加安全审核>登录/注销和会话>现有连接)。注意StartTime和EndTime,也许它会像30s一样有趣(默认命令超时)?
然后尝试仅使用Crate和Truncate任务运行此包(没有循环)以消除其他组件干扰的可能性(使用相同的Connection Manager的数据源?)。如果它工作,请尝试循环,但只将Truncate任务放在里面,并继续添加其他组件。