SSIS 如何将 Table-Value 参数传递给存储过程
SSIS how to pass Table-Value parameter into stored procedure
互联网上有很多关于在 SSIS 中传递 Table-Value 参数的文章,但我想知道它们都非常古老且错误,因为过于复杂,因为它们需要脚本组件或许多其他要做的事情。
所以问题是。
- 如何将 Table-Value 参数传递给 ADO.NET 源。
- 如何将 Table-Value 参数传递给 OLE DB 源。
如何以最有效和最快的方式做到这一点
让我们假设 Table 值参数定义为类型
CREATE TYPE [dbo].[IDs_TVP] AS TABLE(
[ID] [INT] NOT NULL
)
可以调用程序
DECLARE @ID dbo.IDs_TVP
INSERT INTO @Clients
(
Text
)
VALUES
('1'),
('1'),
('3')
EXEC dbo.GetClients @Clients = @Clients
程序已定义
CREATE PROCEDURE [dbo].[GetClients]
@Clients dbo.IDs_TVP READONLY
AS
SELECT * FROM @Clients
我不确定这个选项比脚本任务要简洁多少,但是如果你需要使用 table 值参数将数据传递到存储过程中,在使用这个之后包中多个组件中的数据,您可以将数据加载到 global temp table 以进行任何必要的处理。一旦您准备好使用 table 值参数将数据发送到存储过程中,填充一个与 TVP 类型相同的 T-SQL 变量并使用此变量作为存储过程执行存储过程TVP 参数。为此,请确保将所有相关任务放置在 TransactionOption
设置为 Required 的序列容器中。这些组件可以将它们的 TransactionOption
设置为 Supported 或也设置为 Required。如果包中的所有组件都与此特定 objective/data 相关,则可以省略 Sequence 容器,而相同的 TransactionOption
设置将应用于包。如果此方法适合您,您可能需要考虑从存储过程中删除 TVP 并仅使用临时 table。下面是执行 SQL 任务的示例,它从临时 table 填充 table 类型变量,然后以此作为参数执行存储过程。这将适用于 OLE DB 和 ADO.NET 连接
DECLARE @YourParameter AS IDs_TVP
INSERT INTO @YourParameter (ID)
SELECT ID FROM ##TempTable
EXEC dbo.TestSP @YourParameter
DROP TABLE ##TempTable
互联网上有很多关于在 SSIS 中传递 Table-Value 参数的文章,但我想知道它们都非常古老且错误,因为过于复杂,因为它们需要脚本组件或许多其他要做的事情。
所以问题是。
- 如何将 Table-Value 参数传递给 ADO.NET 源。
- 如何将 Table-Value 参数传递给 OLE DB 源。
如何以最有效和最快的方式做到这一点
让我们假设 Table 值参数定义为类型
CREATE TYPE [dbo].[IDs_TVP] AS TABLE(
[ID] [INT] NOT NULL
)
可以调用程序
DECLARE @ID dbo.IDs_TVP
INSERT INTO @Clients
(
Text
)
VALUES
('1'),
('1'),
('3')
EXEC dbo.GetClients @Clients = @Clients
程序已定义
CREATE PROCEDURE [dbo].[GetClients]
@Clients dbo.IDs_TVP READONLY
AS
SELECT * FROM @Clients
我不确定这个选项比脚本任务要简洁多少,但是如果你需要使用 table 值参数将数据传递到存储过程中,在使用这个之后包中多个组件中的数据,您可以将数据加载到 global temp table 以进行任何必要的处理。一旦您准备好使用 table 值参数将数据发送到存储过程中,填充一个与 TVP 类型相同的 T-SQL 变量并使用此变量作为存储过程执行存储过程TVP 参数。为此,请确保将所有相关任务放置在 TransactionOption
设置为 Required 的序列容器中。这些组件可以将它们的 TransactionOption
设置为 Supported 或也设置为 Required。如果包中的所有组件都与此特定 objective/data 相关,则可以省略 Sequence 容器,而相同的 TransactionOption
设置将应用于包。如果此方法适合您,您可能需要考虑从存储过程中删除 TVP 并仅使用临时 table。下面是执行 SQL 任务的示例,它从临时 table 填充 table 类型变量,然后以此作为参数执行存储过程。这将适用于 OLE DB 和 ADO.NET 连接
DECLARE @YourParameter AS IDs_TVP
INSERT INTO @YourParameter (ID)
SELECT ID FROM ##TempTable
EXEC dbo.TestSP @YourParameter
DROP TABLE ##TempTable