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

Integration Service: How do I change the structure of a SQL Server table in a Data Flow task?

我在 Visual Studio.Integration Service 项目中工作。

我想做的是创建一个包,从远程数据库中的SourceTable读取数据,对数据进行一些转换,然后将其读入另一个数据库中的DestinationTable。 我知道该怎么做,但我的问题是,在对数据进行转换之前,我想从 table 中删除很多行。 下面的 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

如何实现?

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

您可能想要创建到源数据库和目标数据库的 OLE DB 连接。

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

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

在生成的 window 中,select 指向 SourceTable 数据库的 OLE DB 连接管理器。

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

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

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

修复查询

提供的查询缺少 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