正如大多数人所知,当使用存储过程和临时表作为OleDbSource时,SSIS很难读取元数据。以前,可以通过在EXEC语句之前添加SET FMTONLY OFF;来轻松防止这种情况发生。不过,这样做的缺点是在验证期间执行了存储过程,这可能需要一段时间。从SQL 2012开始,我们可以使用WITH RESULT SETS指定列及其数据类型。SSIS将识别此内容,SQL领域中的所有问题都会解决。
不过,我想要生成一个使用此类存储过程作为源的BIML包,但我无法使其正常工作。假设我有一个名为'dbo.csp_MyCsp'的存储过程,它使用了一个名为'#MyTempTable'的临时表,其中包含1列'ColA int'。我正在尝试使用以下(类似的)Biml代码生成一个OleDbSource:
我遇到了一个错误,提示“#MyTempTable对象无效”。奇怪的是,如果我打开一个包并将该代码粘贴到我的OleDbSource中,它可以正常工作,没有任何错误。我有一种直觉,即SSIS和BIML的验证步骤不同。
你们有适当的解决方案吗?我不能使用FMTONLY OFF,因为存储过程需要一些时间来加载,这会导致生成超时。我正在使用SQL Server / SSIS 2014。
谢谢! Marvin
不过,我想要生成一个使用此类存储过程作为源的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。
谢谢! Marvin