由于 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,不需要存储过程。谢谢你们!
我知道这似乎是一个常见问题,但我的情况很特殊,我找不到答案。
我有一个简单的 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,不需要存储过程。谢谢你们!