0

我需要在 SSIS 包中“展平”结果集 - 也就是说,获取一个由多行组成的结果集并生成一个带有连接值的字符串。

结果集通过存储过程返回给我,由于多种原因我无法更改。我不想将逻辑复制到另一个存储过程中,因此限制是我需要从存储过程的结果开始并从那里开始工作。

我目前正在使用带有 ADO.NET 连接的“执行 SQL 任务”来运行存储过程,并将结果返回到 Object 类型的 SSIS 变量中。

我目前的想法(来自谷歌搜索等)然后是使用“执行脚本任务”,使用类似的东西:

    Dim flattened As New StringBuilder()
    Dim adapter As New OleDbDataAdapter
    Dim dt As New DataTable
    Dim row As DataRow

    adapter.Fill(dt, Dts.Variables("DataSet").Value)

    For Each row In dt.Rows
        flattened.Append(row("Column").ToString)
        flattened.Append(DELIMETER)
    Next

    Return flattened.ToString

上面的示例当前返回错误:“对象不是 ADODB.RecordSet 或 ADODB.Record。” 我已经尝试了上述多种不同的变体来尝试解决这个问题,但已经达到了我在环境中调试时遇到的挫败感。

任何想法将不胜感激!谢谢

4

2 回答 2

1

这是一个在 sql 中动态展平表的 sql 示例:

GO
CREATE TABLE CarDealer (
  DealershipID int not null,
  CarColor char(16),
  Model char(16),
  UnitsSold int
);

insert into CarDealer
    select 1, 'Yellow', 'Toyota', 5

insert into CarDealer
    select 1, 'Yellow',  'Ford', 8  

insert into CarDealer
    select 1, 'Red',  'Toyota', 3

insert into CarDealer
    select 2, 'Blue',  'Ford', 7
go

select * from CarDealer

DECLARE @PivHeaders VARCHAR(MAX)

SELECT @PivHeaders =   COALESCE(rtrim(@PivHeaders) + ',[' + rtrim(Val)+ ']',  '[' + rtrim(Val) + ']')
FROM 
(
    select distinct rtrim([VehiclesSold]) + ltrim(Color) as Val
    from
    (
        select * from CarDealer
    ) s1
    UNPIVOT
    (
        VehiclesSold For Color in
        ([CarColor], [Model])
    ) unp        
) s1

--print @PivHeaders

DECLARE @PivotSQL NVARCHAR(MAX)
SET @PivotSQL = N'select DealershipID, p.*  from 
(
    select UnitsSold, rtrim([VehiclesSold]) + ltrim(Color) as Val, DealershipID
    from
    (
        select * from CarDealer
    ) s1
    UNPIVOT
    (
        VehiclesSold For Color in
        ([CarColor], [Model])
    ) unp        
) s1
PIVOT
(   
    Sum (UnitsSold)
    FOR Val
    In 
    ('
        + @PivHeaders + '
    )
) p'

EXECUTE(@PivotSQL)
于 2012-02-27T14:53:28.473 回答
0

不确定这是否是最好的方法,但我发现可行的方法是:

Dim dt As DataTable = CType(Dts.Variables("DataSet").Value, DataSet).Tables(0)

然后在我的循环中循环 dt 。

如果有人知道更好的方法,请仍然回答,我会相信你的答案。如果没有,那么将把这个答案留给未来有同样问题的人。

谢谢

于 2009-11-18T11:51:08.493 回答