首页 > 解决方案 > SSIS如何将表值参数传递给存储过程

问题描述

互联网上有多篇关于在 SSIS 中传递 Table-Value 参数的文章,但我想知道它们都非常陈旧且错误,因为它们过于复杂,因为它们需要脚本组件或许多其他事情要做。

所以问题是。

  1. 如何将 Table-Value 参数传递到 ADO.NET 源。
  2. 如何将表值参数传递到 OLE DB 源。

如何以最有效和最快的方式做到这一点

让我们假设表值参数定义为类型

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

标签: c#sql-serverssistable-valued-parameters

解决方案


我不确定这个选项会比脚本任务少多少冗长,但是如果您需要使用表值参数将数据传递到存储过程中,在使用包中的多个组件中的这些数据之后,您可以将数据加载到全局临时表以进行任何必要的处理。准备好使用表值参数将数据发送到存储过程后,填充与 TVP 相同类型的 T-SQL 变量并使用此变量作为 TVP 参数执行存储过程。为此,请确保将所有相关任务放在TransactionOption设置为必需的序列容器中。组件可以有它们的TransactionOption支持或设置为必需。如果包中的所有组件都与此特定目标/数据相关,则可以省略序列容器,并且相同的TransactionOption设置将应用于包。如果此方法适合您,您可能需要考虑从存储过程中删除 TVP 并仅使用临时表。下面是一个执行 SQL 任务的示例,它从临时表中填充一个表类型变量,然后使用这个作为参数执行存储过程。这适用于 OLE DB 和 ADO.NET 连接

DECLARE @YourParameter AS IDs_TVP

INSERT INTO @YourParameter (ID)
SELECT ID FROM ##TempTable

EXEC dbo.TestSP @YourParameter

DROP TABLE ##TempTable

推荐阅读