SSIS JOIN最佳实践

问题描述

我的任务是将SQL选择语句转换为SSIS包。但是,我不确定应该如何处理JOINS。最好使用合并/合并联接吗?我是否应该在OLE DB连接中简单地使用此select语句?我想使用将提供最佳性能的方法。

这是我的SQL:

SELECT
    AC.Sys_ID,AC.Number,Approval,AC.[Type],Category,AC.[Configuration item],AC.[Short description],[Planned start date],[Actual start],AC.[Planned end date],[Actual end],AC.[Assignment group],AC.[Assigned to],AC.Risk,[State],Closed,AC.[Close code],ICC.Number,ICC.Opened,ICC.[Priority],ICC.[Short description],ICC.Resolved,NULL AS DCIO,EOMONTH(DATEADD(M,-1,AC.Report_Date)) AS Reporting_Month_End_Date,AC.Report_Date,AC.Ingestion_Date
FROM
    RAW.SERVICENOW_IMPLEMENTED_CHANGES AS AC    
    LEFT OUTER JOIN (SELECT [Caused by change number],MAX(Opened) AS Max_Opened FROM RAW.SERVICENOW_INCIDENTS_CAUSED_BY_CHANGE GROUP BY [Caused by change number]) AS MICC ON AC.Number = MICC.[Caused by change number]
    LEFT OUTER JOIN RAW.SERVICENOW_INCIDENTS_CAUSED_BY_CHANGE AS ICC ON MICC.[Caused by change number] = ICC.[Caused by change number] AND MICC.Max_Opened = ICC.Opened

解决方法

SQL Server或任何数据库都可以具有索引,这将提高您匹配数据的能力。 SSIS没有索引,因此每次您想要连接数据时,要么必须在源系统中进行排序,要么在包中进行排序。 @Piotr和@ericBrandt的评论正确无误-向后退,因为给出的方向很愚蠢。

那是说,对于这种特定情况,您只是将“服务已实施的更改”中的现有行与更改所引起的“服务立即发生”事件相结合。这是联接上的1到可选1(假设我正确阅读了此信息)。

添加查找组件LKP MICC。指定数据来自查询,并指定它应忽略错误。

SELECT [Caused by change number],MAX(Opened) AS Max_Opened 
FROM RAW.SERVICENOW_INCIDENTS_CAUSED_BY_CHANGE 
GROUP BY [Caused by change number]

将输入列[Number]映射到[由变更编号引起],并检查Max_Opened列,以便其在下游可用

添加第二个查找组件LKP ICC。指定它也是源于查询,并指定它应忽略错误。

SELECT ICC.Number,ICC.Opened,ICC.[Priority],ICC.[Short description],ICC.Resolved
FROM RAW.SERVICENOW_INCIDENTS_CAUSED_BY_CHANGE

将输入列[Max_Opened]映射到查找列[Opened]。检查可用的列。

您应该能够运行该软件包。启动时,它将计算MICC和ICC的所有分组,然后将其本地缓存。当行通过时,程序包将检查缓存中是否有匹配的数据。

,

要在SSIS中使用任何其他数据库中的数据,只需使用select语句即可,因为SSIS没有自己的语法。由于SSIS允许开发人员在两种不同的脚本语言之间进行选择:C#或Visual Basic(VB)等。要在何处做出选择,请将脚本任务放到控制流设计图面上。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...