Как можно сгладить набор результатов в SSIS? - PullRequest
0 голосов
/ 18 ноября 2009

У меня есть требование "сгладить" набор результатов в пакете служб SSIS - это взять набор результатов, состоящий из нескольких строк, и создать одну строку с объединенными значениями.

Набор результатов возвращается мне через хранимую процедуру, которую по ряду причин я не могу изменить. Я не хочу дублировать логику в другую хранимую процедуру, поэтому ограничение заключается в том, что мне нужно начинать с результатов хранимой процедуры и работать с нее.

В настоящее время я использую «Выполнить задачу SQL» с подключением ADO.NET для запуска хранимой процедуры и возвращаю результаты в переменную SSIS типа Object.

Моя текущая мысль (от поиска в Google и т. Д.) Заключается в том, чтобы использовать «Выполнить задачу сценария», используя что-то вроде:

    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». Я попробовал довольно много разных вариантов вышеперечисленного, чтобы попытаться решить эту проблему, но дошел до того, что мои разочарования по поводу отладки в среде достигли цели.

Любые мысли приветствуются! Спасибо

Ответы [ 2 ]

1 голос
/ 27 февраля 2012

Это пример 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)
0 голосов
/ 18 ноября 2009

Не уверен, что это лучший способ, но я нашел что-то, что работает:

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

А потом просто цикл dt в моем цикле.

Если кто-нибудь знает лучший способ, пожалуйста, все же ответьте, и я предоставлю вам ответ. Если нет, то оставлю этот ответ будущим людям с такой же проблемой.

Спасибо

...