我使用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
我如何实现这一目标?
答案 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的最大行