【问题标题】:SSIS - Compare Excel With DatabaseSSIS - 将 Excel 与数据库进行比较
【发布时间】:2017-12-14 04:53:29
【问题描述】:

我有一个 SQL Server 2008 R2 数据库,其中有几个表。我将每天或每周以 excel 文件格式获取这些表格的新数据和数据更新。我正在使用 SSIS 将 excel 文件加载到临时表中,然后将此临时表记录与主表进行比较以查找更改(因为我需要在更新更改之前进行一些审核)

在 SSIS 中有什么方法可以直接将 excel 文件记录与主表进行比较?即不将它们存储到临时表中

【问题讨论】:

  • 这样做有什么理由吗?
  • 我想避免需要额外的表以及减少数据库命中
  • 在 SSIS 中创建临时表并将它们与数据库中的事实表进行比较。将数据加载到临时表中始终是一个好习惯,因为您可以检索任何不匹配的记录。
  • 我该如何实现?你能提供一些例子@BHouse
  • @JayasuryaSatheesh 您可以使用 T-SQL 或使用来自 SSIS 的合并联接或查找转换来实现此目的,请查看我的答案以获取更多信息

标签: sql-server excel ssis sql-server-2008-r2 ssis-2008


【解决方案1】:

使用 T-SQL

您可以在查询中使用OPENROWSET() 函数从excel 中读取数据,并且可以将其与SQL 表连接起来,而无需临时表。

查询示例

SELECT * FROM AmenityData As a
INNER JOIN  TypesToGroups As b
ON a.ClassCode =  b.FacilityTypeID
INNER JOIN Groups As c
ON b.GroupID = c.GroupID
INNER JOIN  OPENROWSET ('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;Database=C:\postaldistricts.xls;HDR=YES', 'SELECT *    FROM [Sheet1$]') As d
ON d.[PostalDistricts] = a.[PostalDistrict]

您可以参考以下链接了解更多信息:

注意:还有其他方法,如OPENDATASOURCE()OPENQUERY() 或创建链接服务器,但我尝试的是OPENROWSET(),您可以在我提供的链接中找到有关这些方法的更多信息


使用 SSIS

使用合并连接

在 SSIS 中,您可以创建使用 Merge Join 来执行 LEFT JOININNER JOIN 操作。

欲了解更多信息,请参阅我在How Intersect and Except result in SSIS的回答

使用查找转换

或者你可以使用 Lookup 转换来执行连接(Merge join 对 JOIN 有更好的性能),只需参考以下链接:

【讨论】:

  • 我有 2 个表。1 个在 Sql server 中,另一个在 Oracle 中,现在我想根据连接 2 个列比较这 2 个表的记录,然后对 1 个或多个列进行比较。然后我需要在 SSIS 做什么?
  • 可以从sql server为oracle数据库创建链接服务器,然后使用简单的join查询
  • 或者您可以使用合并连接转换或查找从 SSIS 实现此目的
  • 如果我使用查找转换并且如果我的源和目标数据是无序的,那么在这种情况下,考虑到源和目标有 2000 万个数据,查找转换将如何工作?
  • @Learning-Overthinker-Confused Lookup 转换不需要排序,但 Merge Join 需要。
【解决方案2】:

您可能需要考虑执行 UPSERT(更新现有/插入新)。匹配的被插入,不匹配的被重定向到别处。

http://rad.pasfu.com/index.php?/archives/46-SSIS-Upsert-With-Lookup-Transform.html

【讨论】:

  • 我不介意插入,我需要的是一种无需使用中间临时表即可审核更新记录的方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-31
  • 2018-04-18
相关资源
最近更新 更多