sql-server - 使用带有临时表的存储过程的 BIML 生成 SSIS 包

标签 sql-server ssis biml

大多数人都知道,每当将带有临时表的存储过程用作 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/

相关文章:

odbc - 如何防止 BIML Express 引用 ODBC 驱动程序

sql - 根据字符范围选择字符串字段的最佳方法是什么?

sql-server-2008 - 导入CSV文件时如何删除文本周围的双引号?

ssis - SQL 导入和导出向导将 nvarchar(max) 映射到 csv 中的等效数据类型

C# - 转换日期时间格式 yyyy-MM-dd

BIML Studio 与 Visual Studio

visual-studio - 无法在 Visual Studio 中保存 BIML 文件

c# - 使用 dapper 查询空间数据

sql - 不同where条件句的聚合函数

sql - TSQL: "IN"子句中的 NULL