【问题标题】:SSIS Flat File data column compare against table's column data rangeSSIS 平面文件数据列与表的列数据范围比较
【发布时间】:2013-07-05 16:54:58
【问题描述】:

我需要开发一个 SSIS 包,我需要在其中导入/使用一个平面文件(只有 1 列)来将每一行与现有表的 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 包中完成它,我就无法解决这个问题。

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

【问题讨论】:

  • 您是否尝试在平面文件数据值位于数据的某个开始/结束之间的位置进行某种查找?如果它不符合这些值中的任何一个,你的计划是什么?根据您的示例数据,是否存在您的值可能重叠并为同一值生成不同 ID 的情况?
  • 是的,我需要在开始和结束之间查找。如果在该范围内找到它,那么我需要拆分该范围,我可以为该数字添加另一行并扩展该范围。所以范围将变为 id start end 8 110000 111112 9 111113 119099

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


【解决方案1】:

在核心,您将需要使用查找组件。编写查询 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。

【讨论】:

  • 感谢您的反馈。但是我改变了方法并使用 CTE 和级别来构建范围,并使用它来构建不在现有列表中的另一个 CTE 拉范围。它不是那么复杂,但语法是我苦苦挣扎的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多