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 に答える