SSIS Flat File数据列与表的列数据范围进行比较

时间:2013-07-05 16:54:59

标签: sql-server-2008 ssis flat-file data-comparison

我需要开发一个SSIS包,我需要导入/使用一个平面文件(只有一列)来比较每一行与现有表的2列(开始和结束列)。

平面文件数据 -

110000
111112
111113
112222
112525
113222
113434
113453
114343
114545

并将平面文件的每一行与结构/数据进行比较 -

id  start   end
8   110000  119099
8   119200  119999
3   200000  209999
3   200000  209999
2   300000  300049
2   770000  779999
2   870000  879999

现在,如果需要在一个非常简单的简单存储过程中实现它,但是如果我在SSIS包中做到这一点,我无法理解这一点。

有什么想法吗?任何帮助非常感谢。

1 个答案:

答案 0 :(得分:0)

在核心,您将需要使用查找组件。写一个查询SELECT T.id, T.start, T.end FROM dbo.MyTable AS T并将其用作您的来源。将输入列映射到start列并选择id,以便将其添加到数据流中。

如果点击运行,它将执行精确查找,只能找到值110000和119200.要将其转换为范围查询,您需要进入“高级”选项卡。您应该检查3件事:内存量,行数和自定义查询。当你检查最后一个时,你应该得到一个像

这样的查询
SELECT * FROM 
(SELECT T.id, T.start, T.end FROM dbo.MyTable AS T`) AS ref 
WHERE ref.start = ?

您需要将其修改为

SELECT * FROM 
(SELECT T.id, T.start, T.end FROM dbo.MyTable AS T`) AS ref 
WHERE ? BETWEEN ref.start AND ref.end

根据我的经验,范围查询可能变得相当低效,因为它似乎缓存已经看到的内容,因此如果源文件具有110001,110002,110003,您将看到发送到数据库的3个唯一查询。对于小数据集,这可能不是那么糟糕,但它导致我的DW的一些丑陋的加载时间。

另一种方法是爆炸范围。对我来说,我有一个只保留日期范围的源系统,我需要知道白天有什么重要性。范围查找效果不佳所以我制作了一个查询,将2010-01-01到2013-07-07范围内的单行转换为多行,每行有一个日期2013-01-01,2013-01 -02 ...虽然这种方法导致更长的预执行阶段(由于查询在过去的5年中每天必须生成约30k行,但需要几分钟),一旦在本地缓存,这是一个简单的寻找白天的特定交易。

最好,我创建一个数字表,将其填充到int的最大值并完成它,但你可能只需使用内联表值函数generate numbers。您的查询看起来像

SELECT
    T.id
,   GN.number 
FROM 
    dbo.MyTable AS T
    INNER JOIN
        -- Make this big enough to satisfy your theoretical ranges
        dbo.GenerateNumbers(1000000) AS GN
        ON GN.number BETWEEN T.start and T.end;

这将用于“直接”查找,而无需任何高级功能。查找将会非常耗费内存,因此尽可能使查询更紧密。例如,如果您知道您的值将适合int,则将GN.number从bigint转换为源查询中的int。