【问题标题】:Trying to loop through, and delete from, a list of tables using SSIS尝试使用 SSIS 循环遍历表列表并从中删除
【发布时间】:2017-12-21 17:45:13
【问题描述】:

我目前正在为我们的数据库建立归档和清除流程。我从一位几天前离职的员工那里接手了这项任务——过去几个月他一直在(不经常)从事这项工作,所以我不得不花很长时间来追溯他的步骤,并试图弄清楚如何他把这一切都安排好了。我们正在使用计划任务来执行我们的归档过程,我已经准备好部署该部分。但是,我们使用 SSIS 包来处理清除过程,而且我之前从未创建或修改过 SSIS 包,所以我遇到了一些问题,坦率地说,我什至不确定从哪里开始故障排除。

本质上,我们有一个表,用于存储将要归档(并最终清除)的表列表,该表还记录了需要清除表的顺序,以避免留下任何孤立记录或 FK 冲突.然后,SSIS 包的目的是加载表列表,按照清除顺序排序,然后循环遍历每个表并根据 WHERE 子句从它们中删除,该子句引用每条记录的存档日期。我认为我遇到的问题之一是表名不能用作 SQL 命令中的参数,尽管尝试了一些方法来解决这个问题,但我还是不能让它正常工作。

根据我在其他地方读到的内容,我尝试创建一个包含我要执行的 SQL 语句的变量,然后选择该变量作为 SQL 语句的源,但我仍然没有正确。我想我可能会错误地从包含 SQL 命令的 foreach 循环中提取表名,但我不确定我做错了什么。

如果有帮助,我将在下面发布我正在使用的两个 SQL 命令的图片。我也可以发布 foreach 循环,或与任一命令有关的不同信息。我再次为我的问题含糊不清表示歉意,我只是对 SSIS 还不够熟悉,还不知道提供哪些有用的信息。不幸的是,我没有足够的代表直接发布图片,所以我只提供链接。

清除订单 SQL 命令

删除 SQL 命令

【问题讨论】:

    标签: sql-server ssis etl


    【解决方案1】:

    是的,您的第二个 SQL 任务设置错误。当您选择“变量”作为SQLSourceType 时,SourceVariable 值应该是包含 SQL 语句文本的 SSIS 变量的名称。

    所以不要使用“DELETE FROM WHERE DATEADD(...”

    您的SourceVariable 值应该类似于“User::SqlCmd”,并且您应该使用要执行的完整 SQL 命令填充 SqlCmd 变量。

    【讨论】:

    • 好的。所以我按照你提到的方式设置了这两个字段。但是,似乎正在发生的事情是我用来填充变量的 SQL 命令没有完全构建。我希望这可能是我的语法错误。我将变量设置为等于 "DELETE FROM "+@[User::TableName]+" WHERE DATEADD(month, 6, ArchiveDate)
    • @Nick 那么你没有正确执行你的 foreach 循环 - 你如何填充你的对象变量?您从对象中填充了哪些参数?以及按什么顺序?
    【解决方案2】:

    您似乎没有将for each loop container 的每个循环的结果绑定到您的TableName 变量。 请双击您的for each loop container 然后去variable mapping, 然后确保将索引0 分配给变量TableName。谢谢

    【讨论】:

      【解决方案3】:

      感谢您的回答,我已经解决了这个问题,但我仍然不太确定如何解决。激怒了,我决定尝试删除负责执行清除的 SQL 命令,然后以相同的方式重新创建它。令人费解的是,这解决了问题。

      就像我在问题中所说的那样,我对 SSIS 包的形成方式一无所知,但我想在幕后存储了很多元数据和其他信息。我想,自从我接手一个其他人一直在做的项目时,我所做的更改可能会以某种方式破坏工作。显然情况就是这样。无论如何,再次感谢您的帮助。

      【讨论】:

      • 你必须接受这个答案,即使它是你的。只需单击答案附近的投票箭头下方的接受标记
      猜你喜欢
      • 2012-03-16
      • 2017-02-08
      • 2010-09-23
      • 2017-12-20
      • 2023-03-16
      • 1970-01-01
      • 2019-11-07
      • 2013-10-15
      • 1970-01-01
      相关资源
      最近更新 更多