如何在SSIS包中的两个表上执行连接,其中表名是动态的

时间:2018-01-12 15:23:29

标签: sql-server join ssis

仅供参考,这个问题或多或少是我几周前问过的this question的后续问题。在那种情况下,我怀疑问题本质上是我找到了其他人不完整的代码,并试图更新它而不完全理解他们一直在尝试做什么。我现在遇到的问题与我不熟悉SSIS的事实有关,因此不知道我需要使用哪些工具(即数据流和连接)来做我想要的是什么。

我正在进行一个清除过程,该过程查询包含需要清除的表名称的表,并遍历提供的表名以实际执行清除。由于SSIS不允许将表分配给变量,因此我通过创建具有以下内容的变量来实现此目的:

"DELETE FROM " + @[User::TableName] + " WHERE CreateDate < DATEADD(month, -5, GETDATE())"

并创建一个执行SQL任务以使用该变量作为SQL查询运行。 TableName值是从我用来查询我之前提到的表的foreach循环传递的。

我现在遇到的问题是我需要修改清除过程,以便能够使用我们的存档数据库中的关联表连接正在清除的表,以确保我只清除已有的记录已经存档。因为这些表具有相同的名称但存在于不同的数据库中,所以我希望能够只使用两次TableName值进行连接。但是,我试图实现这一点的方法似乎都没有效果。具体来说,我似乎在尝试别名加入的两个表时会遇到问题。我见过一些有类似问题的人通过创建两个表对应的OLE DB源对象并使用SSIS合并连接来加入它们来解决这些问题。但是,我还没有能够实现这一点,因为SSIS似乎无法从动态表名创建源对象。或者我至少不知道如何做到这一点。

感谢您提供的任何帮助,如果我能提供任何其他信息,请与我们联系。我触摸这个项目已经有几个星期了,所以我对自己的工作方式感到很自信,所以如果有什么不清楚我会道歉。

1 个答案:

答案 0 :(得分:0)

您可以通过修改变量中的SQL以使用3部分命名并在SQL中执行JOIN来完成此操作:

"DELETE FROM Database1." + @[User::TableName] 
 + " FROM Database1." + @[User::TableName] 
 + " JOIN Database2." + @[User::TableName]
 + " ON {SomeCondition} 
WHERE CreateDate < DATEADD(month, -5, GETDATE())"

在上面的伪代码中,我假设表的Schema包含在@[User::TableName]的值中。如果不是,则必须将其包含在查询中。