由于DB触发器,SSIS OLE DB命令元数据错误

时间:2017-04-10 17:21:55

标签: sql-server ssis metadata oledb etl

我知道这似乎是一个常见问题,但我有一个独特的情况,我无法找到答案。

我有一个简单的SSIS包,我想用它来从Excel电子表格更新表。我将使用执行存储过程的OLE DB命令任务执行此操作。但是,它不会检索要映射的任何列名。错误类似于:

无法确定元数据,因为语句'insert into #TempTable ...'使用临时表。'

我理解为什么它会返回此错误,并且知道典型的解决方法。但是,错误不是来自程序包调用的存储过程。该proc不使用临时表。这是更新触发数据库触发器的结果,该触发器调用另一个proc,它使用临时表。

不幸的是,导致错误的触发proc来自我正在开发的第三方应用程序,并且无法修改。

有没有人知道一个不涉及将代码添加到违规行为的解决方案?

谢谢!

3 个答案:

答案 0 :(得分:1)

您最好的选择是将更新暂存到专用表(而不是OLE DB目标),然后将执行SQL任务作为后续事件。

在“执行SQL任务”中,设置游标以粉碎登台表,然后调用存储过程。

DECLARE CSR CURSOR
READ_ONLY
FOR SELECT Col1, Col2
FROM staging;

DECLARE @Col1 nvarchar(100)
,   @Col2 nvarchar(100);
OPEN CSR;

FETCH NEXT FROM CSR INTO @Col1, @Col2;
WHILE (@@fetch_status <> -1)
BEGIN
    IF (@@fetch_status <> -2)
    BEGIN
        EXECUTE dbo.MyProcedure @Col1, @Col2;
    END
    FETCH NEXT FROM CSR INTO @Col1, @Col2;
END

CLOSE CSR;
DEALLOCATE CSR;

答案 1 :(得分:1)

选项1,将Excel电子表格加载到临时表,然后使用“执行SQL任务”更新最终表。 选项2,创建脚本任务,从电子表格中读取并更新最终表,从而避免通过数据流进行列映射。

答案 2 :(得分:0)

我发布此消息后不久就发生了临时表方法,这就是我选择的路线。虽然不是这种简单包装的理想选择,但确实有效。游标甚至不需要......对于这个包,我只需从登台表中更新相应的表,不需要存储过程。谢谢你们俩!