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

SSIS OLE DB Command metadata error because of DB trigger

我知道这似乎是一个常见问题,但我的情况很特殊,我找不到答案。

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

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

我了解它返回此错误的原因,并且知道典型的解决方法。但是,错误并非来自程序包调用的存储过程。该过程不使用临时 tables。这是更新触发调用另一个 proc 的数据库触发器的结果,它确实使用 temp tables。

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

有谁知道不涉及向有问题的过程添加代码的解决方案吗?

谢谢!

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

在执行 SQL 任务中,设置游标以分解暂存 table,然后调用您的存储过程。

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,将 Excel 电子表格加载到暂存 table,然后使用 'Execute SQL Task' 更新您的最终 table。 选项 2,创建脚本任务,从电子表格中读取并更新您的最终 table,从而避免通过数据流进行列映射。

在我发布这篇文章后不久,我想到了暂存 table 方法,这就是我采用的方法。虽然对于这样一个简单的包来说并不理想,但它确实有效。甚至不需要游标...对于这个包,我可以简单地从暂存 table 更新适当的 table,不需要存储过程。谢谢你们!