如何使用where子句是来自另一个数据库的子查询在数据流中创建sourceOLEDB

问题描述 投票:1回答:3

我在数据库中有一些订单ID。我希望在另一个数据库中选择这些命令的le行。

为了实现我的目标,我创建了一个SQL任务来获取变量(对象)中的所有订单id,并为每个循环我包含数据流以提取每个id以放入我的ole db源的请求。但它很长,我建立了很多联系。

我想绕过这个循环,并使用IN而不是=?使用where子句发出一个请求?

但是当我想要映射我的参数时,我得到一个错误,说它不可能使用

SELECT .... WHERE Colon IN ?

谢谢你的帮助

sql sql-server ssis subquery etl
3个回答
2
投票

您需要创建两个OLEDB源查询,然后在要用于IN子句的列上使用MERGE JOIN(使用INNER JOIN)。


1
投票

您可以使用Expression来实现这一目标。

在这个答案中,我将假设您已将一个字符串变量中的所有ID连接起来,如1,2,3,4,5

现在你必须创建一个string @[User::SQLQuery]类型的变量,并将变量EvaluateAsExpression属性设置为true,并定义使用以下表达式:

"SELECT * FROM SourceTable WHERE ID IN (" + @[User::InClauseVariable] + ")"

(其中@[User::InClauseVariable]是包含值的变量)

并且在OLEDB源中将访问模式更改为SQL Command from Variable并使用变量@[User::SQLQuery]


1
投票

两个数据库是否都托管在同一个SQL Server实例上?如果是这样,可以使用三个部分名称在初始查询中执行过滤,例如Database.Schema.Table。在下面的示例中,TABLE2用于检查匹配的ID。在OLE DB源中将数据访问模式更改为SQL命令,然后您可以使用此命名约定引用其他数据库(在同一服务器上)中的表。 INNER JOIN用于仅返回TABLE1中匹配的行。问题没有表明ID列是否是唯一的,所以为了安全起见我假设它不是,并且在子查询中使用DISTINCT以确保仅返回唯一值。如果表位于不同服务器上的数据库中,则可以使用查找转换仅返回源表中的行,并在执行查找的表中使用匹配的ID。这在下面进一步概述。

  • 在Lookup Transformation编辑器中,选择Redirect Rows to No Match Output页面上的General选项。
  • Connection选项卡中,为包含将用于执行查找的表的数据库选择OLE DB连接管理器(对ID进行过滤)。我建议使用SQL查询选项而不是表/视图,以便只检索必要的列。对于SQL查询,请编写一个查询,从表中选择将用于匹配ID的ID列。
  • Columns窗格中,将一行从Available Input Columns框中的ID列拖到Available Lookup Columns框中的ID列。
  • 将查找转换的输出连接到目标时,选择Lookup Match Output以返回匹配的行。 Lookup No Match Output可以忽略,这些行将被丢弃。

示例三部分命名约定:

SELECT
    T1.ID
FROM DATABASE1.SCHEMA.TABLE1 T1
INNER JOIN (SELECT DISTINCT ID FROM DATABASE2.SCHEMA.TABLE2) T2 ON T1.ID = T2.ID
© www.soinside.com 2019 - 2025. All rights reserved.