大多数人都知道,只要将带有临时表的存储过程用作 OleDbSource,SSIS 就很难读取元数据。以前,这可以通过添加 SET FMTONLY OFF 来轻松防止;在执行语句之前。这样做的缺点是存储过程在验证期间被执行,这可能需要一段时间。从 SQL 2012 开始,我们可以使用 WITH RESULT SETS 来指定列及其数据类型。SSIS 将接受这一点,并且在 SQL 领域一切都很好。
但是,我想用 BIML 生成一个包,它使用这样的存储过程作为源,但我无法让它工作。假设我有一个名为“dbo.csp_MyCsp”的存储过程,它使用一个名为“#MyTempTable”的临时表,其中包含 1 列“ColA int”。我正在尝试使用以下(类似)Biml 代码生成 OleDbSource:
<OleDbSource ConnectionName="MyConnection" Name="OLE_SRC Test">
<DirectInput>
EXEC dbo.csp_MyCsp
WITH RESULT SETS
(
([Col1] int)
)
</DirectInput>
</OleDbSource>
我收到一条错误消息,提示“无效对象 #MyTempTable”。奇怪的是,如果我打开一个包并将该代码粘贴到我的 OleDbSource 中,它可以正常工作而没有任何错误。我有一种直觉,SSIS 和 BIML 的验证步骤是不同的。
你们有没有合适的解决方案?我不能使用 FMTONLY OFF,因为存储过程需要一些时间来加载,这会导致生成超时。我正在使用 SQL Server / SSIS 2014。
提前致谢!
马文