大多数人都知道,每当将带有临时表的存储过程用作 OleDbSource 时,SSIS 都很难读取元数据。以前,这可以通过添加 SET FMTONLY OFF 轻松防止;在 EXEC 语句之前。这样做的缺点是存储过程在验证期间被执行,这可能需要一段时间。从 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。
提前致谢!
马文
最佳答案
我自己以前也遇到过这些问题。我使用了描述的解决方案 here .最初的答案与使用 BIML 生成无关,但我已成功地将此解决方案与 Visual Studio 2015 中的 BIML Express 一起使用。
我以这个存储过程为例:
CREATE PROCEDURE csp_MyCsp
AS
BEGIN
SET NOCOUNT ON;
IF 1 = 0
BEGIN
SELECT CONVERT(INT, NULL) AS [database_id]
, CONVERT(SYSNAME, NULL) AS [name]
END;
CREATE TABLE #mydatabases (
[database_id] INT,
[name] SYSNAME
);
INSERT INTO #mydatabases
SELECT [database_id], [name]
FROM sys.databases
SELECT [database_id], [name]
FROM #mydatabases
END;
这包含在我的 BIML 中:
EXEC dbo.csp_MyCsp WITH RESULT SETS (
(
[database_id] INT,
[database_name] SYSNAME
)
)
关于sql-server - 使用带有临时表的存储过程的 BIML 生成 SSIS 包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41623569/