【发布时间】:2016-07-18 13:47:05
【问题描述】:
我想我偶然发现了一个极端情况,即 ADO.NET 数据源和 OLDEB 数据源都不能完全满足我的需求:
-
控制流 -> 执行 SQL 任务 -> ADO.NET 数据源允许以用户定义的表(表值参数)作为参数来处理存储过程。
- 但是,我没有办法/不知道如何将数据插入到另一台服务器上的表中。
-
数据流 -> OLEDB 数据源允许将一台服务器上数据源的结果直接通过管道传输到另一台服务器上的数据源中。
- 但是,所有数据流源(OLEDB 数据源甚至 ADO.NET 数据源)似乎都不允许传入参数映射,因此无法传入复杂的用户定义类型。
- 我也不能使用变量表达式,因为似乎没有办法将对象作为表达式值插入。
Server1 有以下存储过程:
CREATE TYPE [dbo].[OrderKeyList] AS TABLE(
[OrderKey] [varchar](50) NULL
)
GO
CREATE PROCEDURE [dbo].[GetAllOrdersInOrderList] (
@OrderList dbo.OrderKeyList not null
)
AS
BEGIN
SELECT o.*
FROM dbo.Orders o
WHERE o.OrderKey in (SELECT o.OrderKey FROM @OrderList);
END
GO
SSIS包如下:
.-[Sequence Container]-----------------------------------------------.
| |
| .-[Data Flow Task - Populate User Variable User::OrderList]-. |
| | | |
| '-----------------------------------------------------------' |
| | |
| \|/ |
| .-[Execute SQL Task - call dbo.GetOrdersByOrderList]--------. |
| | | |
| '-----------------------------------------------------------' |
| | |
| \|/ |
| .-[ ?????????????????????????????????????? ]----------------. |
| | | |
| '-----------------------------------------------------------' |
'--------------------------------------------------------------------'
我能想到的唯一解决方案是在 Source DB 上添加第二个存储过程,它采用 @OrderList varchar(max) 而不是 dbo.OrderKeyList 表,并调用 dbo.Split(',', @OrderList) 并将其传递给真正的存储过程:
CREATE PROCEDURE [dbo].[GetAllOrdersInOrderListWrapper] (
@OrderList varchar(max)
)
AS
BEGIN
DECLARE @tmpOrderList dbo.OrderKeyList
SELECT
DISTINCT CAST(o.Data as varchar(50))
INTO @tmpOrderList
FROM dbo.Split(',', @OrderList) o;
EXEC dbo.GetAllOrdersInOrderList @tmpOrderList
END;
GO
但我真的不喜欢这种方法,因为:
- 它将如何扩展到数千行?
- 它需要存储过程源添加另一个存储过程,仅用于 SSIS。
【问题讨论】:
标签: sql-server sql-server-2008 ssis