我需要在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
上面的示例当前返回错误:“Object不是ADODB.RecordSet或ADODB.Record。”我已经尝试了上面的几个不同变体来尝试解决这个问题但是已经达到了我在环境中调试的挫败感已经到位的程度。
任何想法都将不胜感激! 感谢
答案 0 :(得分: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)
答案 1 :(得分:0)
不确定这是否是最佳方式,但我发现有效的方法是:
Dim dt As DataTable = CType(Dts.Variables("DataSet").Value, DataSet).Tables(0)
然后在我的循环中循环dt。
如果有人知道更好的方法,请仍然回答,我会相信你的答案。如果没有,那么将为未来有同样问题的人留下这个答案。
由于