gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 09:44:42 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com