我不使用SSIS中的临时表 [英] I don't use temp table in SSIS

查看:19
本文介绍了我不使用SSIS中的临时表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在SSIS中使用OLE-DB源临时表时出现问题。

我在Execute T-SQL语句任务中创建了临时表,并更改了DelayValidation:True和RetainSameConnection:True。但问题并未得到解决。

推荐答案

背景

这里可能发生的情况是,该表目前不存在。临时表有两种变体:本地表和全局表。

本地临时表,使用的名称前面有一个尖锐/磅/散列/octothorpe,即#TEMP。唯一可以使用该临时表实例的查询是创建该临时表的查询。这就是为什么互联网上的建议说您需要将RetainSameConnection设置为True,以确保在数据流中重用创建表的连接。否则,您将受制于连接池,并且可能在两个位置使用相同的连接,也可能不是,相信我,尝试和调试这是一种令人不快的随机性。数据流上DelayValidation的原因是,当包启动时,引擎将在执行任何工作之前验证所有数据看起来都像预期的那样。由于前一步是使数据流任务进入预期状态的步骤,因此我们需要告诉执行只在执行之前验证任务。验证总是会发生的,只是你什么时候付出代价的问题。

定义全局临时表时,会在其前面加上一个双锐号/ETC符号##TEMP。这可由任何进程访问,而不仅仅是创建它的连接。它将一直存在,直到创建的连接消失(或显式将其断开)。

解决方案

一旦包设计完成(在数据流中建立元数据),使用本地临时表就可以很好地工作。不过,在开发它时,不可能将本地临时表用作数据流中的源。如果您执行前身步骤,则该连接将打开,创建临时表,然后该连接和临时表一样消失。

我将通过以下步骤解决此问题

  1. 将执行SQL任务中的查询复制到SSMS的窗口中,并将本地临时表创建为全局临时表,从而##TEMP
  2. 创建一个SSIS变量,名为SourceQuery,类型为字符串,值为SELECT * FROM ##TEMP;
  3. 将";数据访问模式从";SQL命令修改为";SQL命令,并使用变量User::SourceQuery
  4. 完成数据流设计
  5. 保存包以确保元数据被持久化
  6. 将变量中的查询从引用##temp更改为#temp
  7. 再次保存。
  8. 删除##TEMP表或关闭连接
  9. 运行包以确保一切按我的预期运行。

上面的步骤2、3和6允许您模仿魔术师从所有盘子下面拉出桌布。

如果您要在数据流本身中手动编辑从##TEMP到#TEMP的查询,则会触发验证,并且由于没有可用的#TEMP表,它将报告VS_NEEDSNEWMETADATA,并且可能不允许您保存包。使用变量作为查询源提供了一定程度的间接性,使我们可以绕过";更改时验证/重新初始化元数据步骤。

这篇关于我不使用SSIS中的临时表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆