本文介绍了我不使用SSIS中的临时表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
在SSIS中使用OLE-DB源临时表时出现问题。
我在Execute T-SQL语句任务中创建了临时表,并更改了DelayValidation:True和RetainSameConnection:True。但问题并未得到解决。
推荐答案
背景
这里可能发生的情况是,该表目前不存在。临时表有两种变体:本地表和全局表。
本地临时表,使用的名称前面有一个尖锐/磅/散列/octothorpe,即#TEMP
。唯一可以使用该临时表实例的查询是创建该临时表的查询。这就是为什么互联网上的建议说您需要将RetainSameConnection
设置为True,以确保在数据流中重用创建表的连接。否则,您将受制于连接池,并且可能在两个位置使用相同的连接,也可能不是,相信我,尝试和调试这是一种令人不快的随机性。数据流上DelayValidation
的原因是,当包启动时,引擎将在执行任何工作之前验证所有数据看起来都像预期的那样。由于前一步是使数据流任务进入预期状态的步骤,因此我们需要告诉执行只在执行之前验证任务。验证总是会发生的,只是你什么时候付出代价的问题。
##TEMP
。这可由任何进程访问,而不仅仅是创建它的连接。它将一直存在,直到创建的连接消失(或显式将其断开)。解决方案
一旦包设计完成(在数据流中建立元数据),使用本地临时表就可以很好地工作。不过,在开发它时,不可能将本地临时表用作数据流中的源。如果您执行前身步骤,则该连接将打开,创建临时表,然后该连接和临时表一样消失。我将通过以下步骤解决此问题
- 将执行SQL任务中的查询复制到SSMS的窗口中,并将本地临时表创建为全局临时表,从而
##TEMP
。 - 创建一个SSIS变量,名为SourceQuery,类型为字符串,值为
SELECT * FROM ##TEMP;
- 将";数据访问模式从";SQL命令修改为";SQL命令,并使用变量
User::SourceQuery
- 完成数据流设计
- 保存包以确保元数据被持久化
- 将变量中的查询从引用##temp更改为#temp
- 再次保存。
- 删除##TEMP表或关闭连接
- 运行包以确保一切按我的预期运行。
上面的步骤2、3和6允许您模仿魔术师从所有盘子下面拉出桌布。
如果您要在数据流本身中手动编辑从##TEMP到#TEMP的查询,则会触发验证,并且由于没有可用的#TEMP表,它将报告VS_NEEDSNEWMETADATA,并且可能不允许您保存包。使用变量作为查询源提供了一定程度的间接性,使我们可以绕过";更改时验证/重新初始化元数据步骤。这篇关于我不使用SSIS中的临时表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!