【问题标题】:SSIS: How to check if a record DOESN'T exist in flat file but exists on the databaseSSIS:如何检查记录是否存在于平面文件中但存在于数据库中
【发布时间】:2015-07-22 14:44:31
【问题描述】:

我正在准备一个 SSIS 作业,我正在将 .CVSV 文件导入到 OLE DB 目标(sql 数据库)。我们将每天获取这些文件。 .CSV 文件包含医生的记录。每行代表一个医生。下图显示了我如何能够成功地做到这一点。到目前为止没有问题。

以下是我需要帮助的地方:

如果医生不再活跃,我们将获得相同的 .CSV 文件,但没有他/她的记录。如何检查记录是否不在 .CSV 文件中但它存在于 SQL 数据库中?我需要更新 SQL 数据库中的医生行并将该行的 IsActive 字段更新为 false

【问题讨论】:

  • 我们在我工作的地方处理这个确切的问题,我们用纯 SQL 来解决它,我们尽量避免像这样使用 SSIS。我们只需导入表,然后对我们的跟踪表执行所需的连接,以确定护理提供者是否是新的/更新的/终止的。对我们来说,SSIS 部署越少越好,因此我们的目标是将尽可能多的业务逻辑放入数据库中。
  • 嘿@saarrrr 我正在尝试按照您的方式进行操作。我创建了一个临时表,我在其中转储 csv 文件。现在正在处理合并语句。
  • Eric 的伪代码是正确的,尽管您也可以使用左连接来实现对您希望捕获更改的所有字段的单个语句更新。我还建议存档更新记录的先前状态,特别是如果您有不同的认证和身份办公室。他们可能会为改变而竞争,并知道谁改变了重要的东西。

标签: sql sql-server database excel ssis


【解决方案1】:

当然,这是伪代码。

SELECT DoctorID
FROM DrTable
where NOT EXISTS (select DoctorID from CSVTable where CSVTable.DoctorID=DrTable))

您可以使用以下语句在同一语句中进行更新:

UPDATE DrTable

Set IsActive = 0

WHERE Doctorid IN (   SELECT DoctorID
    FROM DrTable
    where NOT EXISTS (select DoctorID from CSVTable where CSVTable.DoctorID=DrTable)))

【讨论】:

  • 你将如何在 ssis 包中实现这个?
  • 我不会。虽然这可能是可能的,但它会更慢也更困难。如上所述的临时表是更常用的方法,因为它利用了 RDBMS 的优势。您是否有理由将整个过程保留在 SSIS 中?
【解决方案2】:

除了 Eric 的回答,您还可以使用 SSIS 默认提供的“合并”功能。 您必须确保您的平面文件源和数据库对于所有列都是相同的数据类型,并且它们都按您用来连接它们的键排序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-25
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    • 2013-08-07
    • 1970-01-01
    相关资源
    最近更新 更多