Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 SSIS平面文件数据列与表的列数据范围进行比较_Sql Server 2008_Ssis_Flat File_Data Comparison - Fatal编程技术网

Sql server 2008 SSIS平面文件数据列与表的列数据范围进行比较

Sql server 2008 SSIS平面文件数据列与表的列数据范围进行比较,sql-server-2008,ssis,flat-file,data-comparison,Sql Server 2008,Ssis,Flat File,Data Comparison,我需要开发一个SSIS包,在这个包中,我需要导入/使用一个平面文件,该文件只有一列,用于将每一行与现有表的两列Start和end列进行比较 平面文件数据- 110000 111112 111113 112222 112525 113222 113434 113453 114343 114545 并将平面文件的每一行与结构/数据进行比较- id start end 8 110000 119099 8 119200 119999 3 200000 209999 3 20

我需要开发一个SSIS包,在这个包中,我需要导入/使用一个平面文件,该文件只有一列,用于将每一行与现有表的两列Start和end列进行比较

平面文件数据-

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包中实现的话,我无法理解这一点


有什么想法吗?非常感谢您的帮助。

在核心部分,您需要使用查找组件。编写一个查询,从dbo.MyTable中选择T.id、T.start、T.end作为T并将其用作源。将输入列映射到起始列并选择id,以便将其添加到数据流中

如果您点击run,它将执行精确的查找,只查找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年中每天必须生成约30000行,因此需要几分钟的时间,而一旦在本地缓存,则只需每天查找给定的事务

最好,我会创建一个数字表,将其填充到int的最大值,然后处理它,但您可能只需要使用一个内联表值函数来处理它。然后,您的查询将类似于

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;

这将用于直接查找,而不需要任何高级功能。尽管如此,查找将非常占用内存,因此请尽可能紧凑地执行查询。例如,如果您知道您的值将适合整数,请在源查询中将GN.number从bigint转换为int。

您是否尝试在平面文件数据值位于数据的某个开始/结束之间时执行某种查找?如果不符合这些价值观,你的计划是什么?根据您的示例数据,您的值是否有可能重叠并为相同的值生成不同的ID?是的,我需要在开始和结束之间查找。如果它在那个范围内,那么我需要分割那个范围,我可以为那个数字添加另一行并扩展那个范围。因此,范围将变为id开始结束8 110000 11111 2 9 11111 3 119099感谢您的反馈。但我改变了方法,使用CTE和级别来构建范围,并使用它来构建不在现有列表中的另一个CTE拉范围。它并没有那个么复杂,但语法是我一直在努力解决的问题。