【问题标题】:How can I flatten a resultset in SSIS?如何在 SSIS 中展平结果集?
【发布时间】:2010-12-17 20:07:23
【问题描述】:

我需要在 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。”我已经尝试了上述多种不同的变体来尝试解决这个问题,但已经到了让我在环境中调试时遇到挫折的地步。

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

【问题讨论】:

    标签: sql-server-2005 ssis flatten


    【解决方案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)
    

    【讨论】:

      【解决方案2】:

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

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

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

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

      谢谢

      【讨论】:

        猜你喜欢
        • 2020-03-20
        • 2020-10-25
        • 2012-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-12
        • 2022-08-19
        相关资源
        最近更新 更多