【发布时间】:2021-11-28 23:47:23
【问题描述】:
我在 SSIS 中使用 OLE-DB Source 临时表时遇到问题。
我在 Execute T-SQL Statement Task 中创建临时表并更改 DelayValidation : True 和 RetainSameConnection : True 。但是问题没有解决。
【问题讨论】:
标签: ssis etl ssis-projects
我在 SSIS 中使用 OLE-DB Source 临时表时遇到问题。
我在 Execute T-SQL Statement Task 中创建临时表并更改 DelayValidation : True 和 RetainSameConnection : True 。但是问题没有解决。
【问题讨论】:
标签: ssis etl ssis-projects
这里可能发生的情况是该表目前不存在。临时表有两种变体:本地和全局。
一个本地临时表,使用一个名称,前面带有一个单一的Sharp/pound/hash/octothorpe,即#TEMP。唯一可以使用该临时表实例的查询是创建它的查询。这就是为什么互联网上的建议说您需要将 RetainSameConnection 设置为 true 以确保在数据流中重用创建表的连接。否则,您将受到连接池的摆布,并且可能在两个地方都使用相同的连接,也许不会,相信我,尝试和调试是一种令人不快的随机性。数据流上出现DelayValidation 的原因是,当包启动时,引擎将在执行任何工作之前验证所有数据是否符合预期。由于前导步骤是使数据流任务进入预期状态的步骤,我们需要告诉执行仅在执行前立即验证任务。验证总是会发生,只是您何时支付价格的问题。
全局临时表的定义是在其前面添加一个双尖/etc 符号##TEMP。任何进程都可以访问它,而不仅仅是创建它的连接。它将一直存在,直到创建连接消失(或明确删除它)。
一旦设计了包(元数据在数据流中建立),使用本地临时表就可以正常工作了。但是,在开发它时,不可能将本地临时表用作数据流中的源。如果您执行前导步骤,该连接将打开,创建临时表,然后连接像临时表一样消失。
我将通过以下步骤解决此问题
##TEMP。SELECT * FROM ##TEMP;
User::SourceQuery
上面的步骤 2、3 和 6 可以让您模拟魔术师从所有盘子下面拉出桌布。
如果您要在数据流本身中手动编辑从 ##TEMP 到 #TEMP 的查询,则会触发验证,并且由于没有可用的 #TEMP 表,它会报告 VS_NEEDSNEWMETADATA 并且可能不会让您保存包裹。使用变量作为查询源提供了一定程度的间接性,可以让我们绕过“更改时验证”/重新初始化元数据步骤。
【讨论】: