【问题标题】:How to perform a join on two tables in an SSIS package, where the table names are dynamic如何对 SSIS 包中的两个表执行连接,其中表名是动态的
【发布时间】:2018-01-12 15:23:29
【问题描述】:

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

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

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

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

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

感谢您提供的任何帮助,如果我可以提供任何其他信息,请告诉我。自从我接触这个项目以来已经有几个星期了,所以我对我的工作方式有点耳目一新,所以如果有任何不清楚的地方,我深表歉意。

【问题讨论】:

  • 您是否尝试使用数据库名称来限定表变量?例如变量 1 = dbname.schema.tablename,variable2 = db2name.schema2.tablename。只要名称是合格的,我就可以使用执行 SQL 任务连接不同数据库中具有相同名称的表。这要求它们在同一台服务器上...如果不是,您需要使用链接服务器。
  • 我记得几周前尝试过这个并遇到了问题,但我可能只尝试对有问题的两个表中的一个进行限定。我会尝试两者并告诉你结果是什么。
  • 这两个数据库是在同一台服务器上吗?
  • @TabAlleman 是的,他们是

标签: sql-server join ssis


【解决方案1】:

您可以通过修改变量中的 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]的值中。如果不是,则必须将其包含在查询中。

【讨论】:

    猜你喜欢
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    • 2018-06-09
    • 1970-01-01
    • 1970-01-01
    • 2014-09-25
    • 2016-10-29
    • 2012-02-09
    相关资源
    最近更新 更多