c# - SSIS如何将表值参数传递给存储过程
问题描述
互联网上有多篇关于在 SSIS 中传递 Table-Value 参数的文章,但我想知道它们都非常陈旧且错误,因为它们过于复杂,因为它们需要脚本组件或许多其他事情要做。
所以问题是。
- 如何将 Table-Value 参数传递到 ADO.NET 源。
- 如何将表值参数传递到 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
解决方案
我不确定这个选项会比脚本任务少多少冗长,但是如果您需要使用表值参数将数据传递到存储过程中,在使用包中的多个组件中的这些数据之后,您可以将数据加载到全局临时表以进行任何必要的处理。准备好使用表值参数将数据发送到存储过程后,填充与 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
推荐阅读
- javascript - React - 如何在反应路由器链接中制作innerHtml以获取父元素的宽度
- dynamics-crm - 在插件中生成报告 (Dynamics 365)
- haskell - 我怎样才能让 Haskell 知道我不在乎泛型的类型是什么?
- excel - VBA:PUT 请求的身份验证问题
- flutter - 在展开 Expandable 小部件时,相邻的小部件也会自行对齐
- javascript - 如何基于 Promise 的动态响应构建 Firestore 查询链
- reactjs - Spring API 跨域
- javascript - Flutter web:试图调用一个非函数,比如null: 'dart.global.myFunction'
- c# - Selenium 等到使用 Element 而不是 By
- c# - 如何从 C# 中的 .so 文件调用外部 C 函数?