【问题标题】:SSIS FOREACH: Remove data from SQL Table if filename already presentSSIS FOREACH:如果文件名已经存在,则从 SQL 表中删除数据
【发布时间】:2017-12-01 17:05:42
【问题描述】:

抱歉,如果我的措辞很糟糕。我今天才开始使用 SSIS。

我编写了一个 FOREACH,它遍历文件夹中的所有文件,并更新我的表 f_actuals 以及不带扩展名的文件名 - 该文件名是 PeriodKey 和业务单位的组合。效果很好。

但是,这旨在为每个业务部门在整个月内从我们的系统中每日上传(因此当月至今每天刷新,直到我们关闭该期间),所以我真正需要的是 FOREACH包括执行以下操作的内容:-

  • 根据 f_actuals 表中已有的文件名检查指定文件夹中要导入的文件名
  • 从 f_actuals 表中删除所有匹配项
  • 继续我已经构建的 FOREACH

我知道这可能是一种效率极低的方法(首选每天增量上传),但文件必须是最新的,因为我们的系统无法轻松提供其他任何内容。

希望这是有道理的。

非常感谢任何帮助。

【问题讨论】:

    标签: sql sql-server visual-studio foreach ssis


    【解决方案1】:

    您可以在 For Each 循环中使用执行 SQL 任务来执行此操作。

    您可以使用 SQL 语句:

    DELETE
    FROM f_actuals
    WHERE filename = ?
    

    或者可能是一个存储过程(接受您的文件名作为参数并执行与上述语句相同的操作),例如:

    EXEC DeleteFromActuals ?
    

    对于循环中的每个文件名,您可以将其存储在一个变量中,并将该变量作为参数传递给执行 SQL 任务(这就是 ? 的含义)。

    要在执行 SQL 任务中映射参数,请转到“参数映射”,然后添加一个新参数。从下拉列表中选择包含文件名的变量,选择数据类型VARCHAR,并将“参数名称”设置为0。“方向”应为“输入”,这是默认值。

    【讨论】:

    • 非常感谢克里斯,我会在我重返工作岗位时努力解决这个问题!
    • 对于任何阅读类似问题的人来说,第一个解决方案效果很好 - 使用我现有的文件名参数进行数据上传,也映射到执行 SQL 命令以删除重复项。我还在我的 FOREACH 中添加了一个文件系统任务,以将新文件移动到存档文件夹并替换重复项。由于整个事情取决于用户如何命名文件,我假设在导入之前可以使用类似的方法来针对另一个表(在本例中是我的日历维度表)验证文件名,以确保文件正确命名。
    猜你喜欢
    • 2021-02-11
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-07
    • 2015-10-08
    相关资源
    最近更新 更多