使用OLE DB源编辑器在SSIS上使用时态表

时间:2017-09-20 20:09:21

标签: sql sql-server ssis

我想执行具有临时表的SP并使用600行代码查询。所以我将SP代码插入变量,然后我调用OLEDB源代码编辑器

临时表:

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

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

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

  

TITLE:Microsoft Visual Studio

     

来自HRESULT的异常:0xC020204A流程错误[查询   [16]]:SSIS错误代码DTS_E_OLEDBERROR。 OLE DB错误   发生了。错误代码:0x80004005。 OLE DB记录可用。   来源:“Microsoft SQL Server Native Client 11.0”Hresult:0x80004005   描述:“因为语句无法确定元数据   '选择VT.ACCOUNTNUM为[CódigodeProveedor],“RFC”= CASE时   V.RFC_MX =''然后v.VATNUM其他v'使用临时表。“。

     流程中的

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

enter image description here

任何人都知道那里发生了什么?此致

3 个答案:

答案 0 :(得分: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在创建之前不知道表列的元数据。即。元数据无法确定。

答案 1 :(得分:1)

这里有一些混乱:

  1. 时间表和临时表是完全不同的东西。 #表示您正在使用临时表。使用临时表的可能性有很大提高,特别是在这种情况下你必须首先加载它!

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

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

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

答案 2 :(得分:0)

您需要做的是将其拆分为两个操作。在'执行SQL任务'中删除并创建语句以及表填充。在DFT中使用select语句。确保'延迟验证'为了运行,您的DFT设置为true。还要确保创建了物理表,而不是全局临时表。

我也建议不要每次都丢弃,而是使用截断语句。