我需要开发一个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包中做到这一点,我无法理解这一点。
有什么想法吗?任何帮助非常感谢。
答案 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。