集成服务:如何在数据流任务中更改SQL Server表的结构?

时间:2016-01-21 12:52:41

标签: sql sql-server visual-studio ssis

我使用Visual Studio中的 Integration Service项目

我想要做的是创建一个从远程数据库中的SourceTable读取数据的包,对数据进行一些转换并将其读入另一个数据库中的DestinationTable。 我知道该怎么做,但我的问题是,在对数据进行转换之前,我想从表中删除很多行。 下面的SELECT将只选择我想要的行:

FROM (
SELECT  
    PatientID,
    PatientName,
    PatientAddress,
    PatientPostalNumber,
    PatientCity,
    ROW_NUMBER() OVER(PARTITION BY PatientID ORDER BY PatientName DESC) rn
    FROM SourceTable
) a
WHERE rn = 1

我如何实现这一目标?

1 个答案:

答案 0 :(得分:1)

您正在寻找数据流任务。这允许您在源和接收器之间移动数据。

您可能希望创建与源数据库和目标数据库的OLE DB连接。

将数据流任务添加到您的包中。双击它。

将OLE DB Source组件添加到数据流。双击它。

在结果窗口中,选择指向SourceTable数据库的OLE DB连接管理器。

将数据访问模式更改为SQL命令,然后使用您的查询。

此时,包只会提取您指定的数据,而不是整个SourceTable

添加OLE DB目标。使用指向DestinationTable数据库的OLE DB连接管理器,并选择DestinationTable作为表。单击“列”选项卡,确保列按预期进行映射。

修复查询

提供的查询缺少select,但看起来您试图在PatientID中找到所有最低的PatientName。如果你发现你的方法不能很好地扩展,相关的子查询虽然可能需要额外的时间来编写,但通常比rownumber方法给我更好的结果

SELECT  
PatientID,
PatientName,
PatientAddress,
PatientPostalNumber,
PatientCity,
FROM SourceTable AS ST
WHERE
    ST.PatientName =
(
    SELECT MAX(STI.PatientName)
    FROM SourceTable AS STI
    WHERE STI.PatientID = ST.PatientID
);

简单地说,给我一个SourceTable中的所有行,其中PatientName是匹配PatientIDs的最大行