【问题标题】:Use temporal table on SSIS using OLE DB source editor使用 OLE DB 源编辑器在 SSIS 上使用时态表
【发布时间】:2017-09-21 14:44:46
【问题描述】:

我想执行具有 600 行代码的临时表和查询的 SP。所以我将 SP 代码插入到变量中,然后我调用 OLEDB Source editor

临时表:

IF OBJECT_ID('tempdb..##TGJAE' ) IS NOT NULL DROP TABLE ##TGJAE 

SELECT
   VOUCHER,
   DATAAREAID,
   TAXITEMGROUP,
   TAXBASEAMOUNT,
   SOURCERECID
INTO ##TGJAE
FROM TAXTRANS 

但是当我尝试保存时,我遇到了问题:

标题:Microsoft Visual Studio

来自 HRESULT 的异常:0xC020204A 流错误 [查询 [16]]:SSIS 错误代码 DTS_E_OLEDBERROR。 OLE DB 错误有 发生了。错误代码:0x80004005。 OLE DB 记录可用。 来源:“Microsoft SQL Server Native Client 11.0”Hresult:0x80004005 说明:“无法确定元数据,因为声明 'SELECT VT.ACCOUNTNUM as [Código de Proveedor], "RFC" = CASE when V.RFC_MX = '' then v.VATNUM else v' 使用临时表。"。

流程错误 [查询 [16]]:无法检索列 来自数据源的信息。确保您的目标表在 数据库可用。

有人知道那里发生了什么吗?问候

【问题讨论】:

  • 为什么是全局温度?为什么不只是本地人?我没有尝试过,但我只能想象使用全局温度会导致 SSIS 出现一些严重问题。
  • 我将其更改为本地表,但仍然出现相同的错误@JacobH

标签: sql sql-server ssis


【解决方案1】:

这里有点猜测,但您可能需要显式定义临时表以通过 SSIS 查询验证。

尝试使用完整的 create 语句而不是 SELECT... INTO

CREATE TABLE ##TGJAE (
     VOUCHER datatype,
     DATAAREAID datatype,
     TAXITEMGROUP datatype,
     TAXBASEAMOUNT datatype,
     SOURCERECID datatype);

INSERT INTO ##TGJAE
     SELECT VOUCHER,
            DATAAREAID,
            TAXITEMGROUP,
            TAXBASEAMOUNT,
            SOURCERECID
     FROM TAXTRANS 

SSIS 对元数据很挑剔,使用SELECT... INTO 创建表意味着 SSIS 在创建表之前不知道表列的元数据。 IE。无法确定元数据。

【讨论】:

  • 我试了一下,但我得到无效的对象名称'##TGJAE'
  • @Ledwing 我误解了这个问题,并认为您有一个临时表在脚本中给您带来麻烦,而不是源组件。您可以设置保留连接,但使用物理表会更轻松。
【解决方案2】:

这里有些混乱:

  1. temporal 表和 temporary 表是完全不同的东西。 # 表示您正在使用临时表。使用临时表不太可能提高性能,尤其是在这种情况下,无论如何您都必须先加载它!

  2. OLE DB 源组件需要输出数据集。您编写的 SQL 根本不输出数据集,这就是您收到错误的原因。您的 SQL 将数据加载到 临时 表中,但不输出数据

根据您的示例,您只需将代码更改为:

SELECT
   VOUCHER,
   DATAAREAID,
   TAXITEMGROUP,
   TAXBASEAMOUNT,
   SOURCERECID
FROM TAXTRANS;

【讨论】:

  • 但是我使用临时表进入另一个选择,这就是我使用它的原因
  • 我们在您的问题上看不到其他选择。我想你的意思是临时的
【解决方案3】:

你需要做的是把它分成两个操作。在“执行 SQL 任务”中使用 drop 和 create 语句以及表填充。在 DFT 中使用 select 语句。确保您的 DFT 的“延迟验证”设置为 true 以便运行。还要确保您创建了一个物理表而不是全局临时表。

我还建议不要每次都删除,而是使用截断语句。

【讨论】:

  • 物理表是什么意思?你的意思是像#TGJAE这样的本地时态表?
  • 不,我是说 dbo.TGJAE 中的物理表。
  • 创建表然后截断比创建临时表更快?我正在做时态表来优化查询时间
  • 不,临时表没有任何额外的好处。拥有一个物理表,您可以对其进行额外的数据操作,并在下次运行之前将其截断将确保更轻松的操作。此外,如果您确实需要使用临时表,那么您需要考虑其他设置来解决您的问题。此链接 - stackoverflow.com/questions/5631010/… 提供了更多信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-29
  • 1970-01-01
  • 2016-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多