我知道这似乎是一个常见问题,但我有一个独特的情况,我无法找到答案。
我有一个简单的SSIS包,我想用它来从Excel电子表格更新表。我将使用执行存储过程的OLE DB命令任务执行此操作。但是,它不会检索要映射的任何列名。错误类似于:
无法确定元数据,因为语句'insert into #TempTable ...'使用临时表。'
我理解为什么它会返回此错误,并且知道典型的解决方法。但是,错误不是来自程序包调用的存储过程。该proc不使用临时表。这是更新触发数据库触发器的结果,该触发器调用另一个proc,它使用临时表。
不幸的是,导致错误的触发proc来自我正在开发的第三方应用程序,并且无法修改。
有没有人知道一个不涉及将代码添加到违规行为的解决方案?
谢谢!
答案 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)
我发布此消息后不久就发生了临时表方法,这就是我选择的路线。虽然不是这种简单包装的理想选择,但确实有效。游标甚至不需要......对于这个包,我只需从登台表中更新相应的表,不需要存储过程。谢谢你们俩!