SSIS 转换:SQL 子查询到 SSIS 任务

SSIS Transformation: SQL Sub Query into SSIS Task

我正在尝试使用 SSIS 深入研究 ETL 的 "Transformation" 部分。我需要使用 SSIS 任务通过 SQL 查询(存储过程)完成任务。

输出是产生前 5 个三元组及其贡献百分比。我已经在 SQL Stored Proc.

中模拟了我正在做的事情

你能指导我怎么做吗?

--Preparing Dataset
CREATE TABLE temp20190716
    (
        WeekNumber INT,
        Triplet VARCHAR(50),
        Product VARCHAR(50) ,
        CustomerType VARCHAR(50),
        Occurence INT
    )

INSERT INTO temp20190716
    (
    WeekNumber ,
    Triplet ,
    Product ,
    CustomerType ,
    Occurence 
    )
VALUES 
    (201915,SUBSTRING(CONVERT(varchar(255), NEWID()),0,4)+':'+SUBSTRING(CONVERT(varchar(255), NEWID()),0,4)+':'+SUBSTRING(CONVERT(varchar(255), NEWID()),0,4) ,'Mobile','Consumer',FLOOR(RAND()*(25-10+1))+10),
    (201915,SUBSTRING(CONVERT(varchar(255), NEWID()),0,4)+':'+SUBSTRING(CONVERT(varchar(255), NEWID()),0,4)+':'+SUBSTRING(CONVERT(varchar(255), NEWID()),0,4),'Mobile','Consumer',FLOOR(RAND()*(25-10+1))+10),
    (201915,SUBSTRING(CONVERT(varchar(255), NEWID()),0,4)+':'+SUBSTRING(CONVERT(varchar(255), NEWID()),0,4)+':'+SUBSTRING(CONVERT(varchar(255), NEWID()),0,4),'Mobile','Consumer',FLOOR(RAND()*(25-10+1))+10),
    (201915,SUBSTRING(CONVERT(varchar(255), NEWID()),0,4)+':'+SUBSTRING(CONVERT(varchar(255), NEWID()),0,4)+':'+SUBSTRING(CONVERT(varchar(255), NEWID()),0,4) ,'Mobile','Consumer',FLOOR(RAND()*(25-10+1))+10),
    (201915,SUBSTRING(CONVERT(varchar(255), NEWID()),0,4)+':'+SUBSTRING(CONVERT(varchar(255), NEWID()),0,4)+':'+SUBSTRING(CONVERT(varchar(255), NEWID()),0,4),'Mobile','Consumer',FLOOR(RAND()*(25-10+1))+10),
    (201915,SUBSTRING(CONVERT(varchar(255), NEWID()),0,4)+':'+SUBSTRING(CONVERT(varchar(255), NEWID()),0,4)+':'+SUBSTRING(CONVERT(varchar(255), NEWID()),0,4),'Mobile','Consumer',FLOOR(RAND()*(25-10+1))+10),
    (201915,SUBSTRING(CONVERT(varchar(255), NEWID()),0,4)+':'+SUBSTRING(CONVERT(varchar(255), NEWID()),0,4)+':'+SUBSTRING(CONVERT(varchar(255), NEWID()),0,4) ,'Mobile','Consumer',FLOOR(RAND()*(25-10+1))+10),
    (201915,SUBSTRING(CONVERT(varchar(255), NEWID()),0,4)+':'+SUBSTRING(CONVERT(varchar(255), NEWID()),0,4)+':'+SUBSTRING(CONVERT(varchar(255), NEWID()),0,4),'Mobile','Consumer',FLOOR(RAND()*(25-10+1))+10),
    (201915,SUBSTRING(CONVERT(varchar(255), NEWID()),0,4)+':'+SUBSTRING(CONVERT(varchar(255), NEWID()),0,4)+':'+SUBSTRING(CONVERT(varchar(255), NEWID()),0,4),'Mobile','Consumer',FLOOR(RAND()*(25-10+1))+10),
    (201915,SUBSTRING(CONVERT(varchar(255), NEWID()),0,4)+':'+SUBSTRING(CONVERT(varchar(255), NEWID()),0,4)+':'+SUBSTRING(CONVERT(varchar(255), NEWID()),0,4) ,'Mobile','Consumer',FLOOR(RAND()*(25-10+1))+10),
    (201915,SUBSTRING(CONVERT(varchar(255), NEWID()),0,4)+':'+SUBSTRING(CONVERT(varchar(255), NEWID()),0,4)+':'+SUBSTRING(CONVERT(varchar(255), NEWID()),0,4),'Mobile','Consumer',FLOOR(RAND()*(25-10+1))+10),
    (201915,SUBSTRING(CONVERT(varchar(255), NEWID()),0,4)+':'+SUBSTRING(CONVERT(varchar(255), NEWID()),0,4)+':'+SUBSTRING(CONVERT(varchar(255), NEWID()),0,4),'Mobile','Consumer',FLOOR(RAND()*(25-10+1))+10),

    (201915,SUBSTRING(CONVERT(varchar(255), NEWID()),0,4)+':'+SUBSTRING(CONVERT(varchar(255), NEWID()),0,4)+':'+SUBSTRING(CONVERT(varchar(255), NEWID()),0,4),'Fixed','Consumer',FLOOR(RAND()*(25-10+1))+10),       
    (201915,SUBSTRING(CONVERT(varchar(255), NEWID()),0,4)+':'+SUBSTRING(CONVERT(varchar(255), NEWID()),0,4)+':'+SUBSTRING(CONVERT(varchar(255), NEWID()),0,4),'Fixed','Consumer',FLOOR(RAND()*(25-10+1))+10),
    (201915,SUBSTRING(CONVERT(varchar(255), NEWID()),0,4)+':'+SUBSTRING(CONVERT(varchar(255), NEWID()),0,4)+':'+SUBSTRING(CONVERT(varchar(255), NEWID()),0,4),'Fixed','Consumer',FLOOR(RAND()*(25-10+1))+10),
    (201915,SUBSTRING(CONVERT(varchar(255), NEWID()),0,4)+':'+SUBSTRING(CONVERT(varchar(255), NEWID()),0,4)+':'+SUBSTRING(CONVERT(varchar(255), NEWID()),0,4),'Fixed','Consumer',FLOOR(RAND()*(25-10+1))+10),       
    (201915,SUBSTRING(CONVERT(varchar(255), NEWID()),0,4)+':'+SUBSTRING(CONVERT(varchar(255), NEWID()),0,4)+':'+SUBSTRING(CONVERT(varchar(255), NEWID()),0,4),'Fixed','Consumer',FLOOR(RAND()*(25-10+1))+10),
    (201915,SUBSTRING(CONVERT(varchar(255), NEWID()),0,4)+':'+SUBSTRING(CONVERT(varchar(255), NEWID()),0,4)+':'+SUBSTRING(CONVERT(varchar(255), NEWID()),0,4),'Fixed','Consumer',FLOOR(RAND()*(25-10+1))+10) ,
    (201915,SUBSTRING(CONVERT(varchar(255), NEWID()),0,4)+':'+SUBSTRING(CONVERT(varchar(255), NEWID()),0,4)+':'+SUBSTRING(CONVERT(varchar(255), NEWID()),0,4),'Fixed','Consumer',FLOOR(RAND()*(25-10+1))+10),       
    (201915,SUBSTRING(CONVERT(varchar(255), NEWID()),0,4)+':'+SUBSTRING(CONVERT(varchar(255), NEWID()),0,4)+':'+SUBSTRING(CONVERT(varchar(255), NEWID()),0,4),'Fixed','Consumer',FLOOR(RAND()*(25-10+1))+10),
    (201915,SUBSTRING(CONVERT(varchar(255), NEWID()),0,4)+':'+SUBSTRING(CONVERT(varchar(255), NEWID()),0,4)+':'+SUBSTRING(CONVERT(varchar(255), NEWID()),0,4),'Fixed','Consumer',FLOOR(RAND()*(25-10+1))+10) ,
    (201915,SUBSTRING(CONVERT(varchar(255), NEWID()),0,4)+':'+SUBSTRING(CONVERT(varchar(255), NEWID()),0,4)+':'+SUBSTRING(CONVERT(varchar(255), NEWID()),0,4),'Fixed','Consumer',FLOOR(RAND()*(25-10+1))+10),       
    (201915,SUBSTRING(CONVERT(varchar(255), NEWID()),0,4)+':'+SUBSTRING(CONVERT(varchar(255), NEWID()),0,4)+':'+SUBSTRING(CONVERT(varchar(255), NEWID()),0,4),'Fixed','Consumer',FLOOR(RAND()*(25-10+1))+10),
    (201915,SUBSTRING(CONVERT(varchar(255), NEWID()),0,4)+':'+SUBSTRING(CONVERT(varchar(255), NEWID()),0,4)+':'+SUBSTRING(CONVERT(varchar(255), NEWID()),0,4),'Fixed','Consumer',FLOOR(RAND()*(25-10+1))+10) 

需要使用 SSIS 实现以下输出

SELECT 
*
FROM
(SELECT TOP 5
    Triplet,
    SUM(Occurence)Sort,
    Triplet+', '+CONVERT(VARCHAR,SUM(Occurence))+', '+ CONVERT(VARCHAR,SUM(Occurence)*100/(SELECT SUM(Occurence) FROM temp20190716 WHERE Product IN ('Mobile') AND CustomerType='Consumer' ))+' %' DisplayName,
    'Consumer Mobile' Tag ,
    CustomerType
FROM temp20190716
WHERE Product IN ('Mobile') AND CustomerType='Consumer'
GROUP BY Triplet ,CustomerType
ORDER BY 2 DESC
UNION 
SELECT TOP 5
    Triplet,
    SUM(Occurence)Sort,
    Triplet+', '+CONVERT(VARCHAR,SUM(Occurence))+', '+ CONVERT(VARCHAR,SUM(Occurence)*100/(SELECT SUM(Occurence) FROM temp20190716 WHERE Product IN ('Fixed') AND CustomerType='Consumer' ))+' %' DisplayName,
    'Consumer Fixed' Tag ,
    CustomerType
FROM temp20190716
WHERE Product IN ('Fixed') AND CustomerType='Consumer'
GROUP BY Triplet ,CustomerType
ORDER BY 2 DESC
)X

SQL中的输出:

如果您的经理绝对不允许您使用 运行 该查询的最佳实践作为存储过程,您可以通过两种方式解决该限制,具体取决于您希望如何使用数据.

选项 #1:将您的查询用作源连接。您可以在使用查询而不是 table/view 的 Data Flow Task 中创建 OLE DB Source。它看起来像这样:

选项 #2:在 Control Flow 中的 Execute SQL Task 中使用查询。在您的 Execute SQL Task 中,您将 ResultSet 属性 设置为 Full Result Set 并将其映射到对象类型的变量。然后,您可以像使用任何其他数据集对象一样使用该对象。如果您需要迭代处理每一行,这将是首选解决方案,例如 Foreach Loop.