如何在数据流中创建源 OLEDB,其中子句是来自另一个数据库的子查询



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

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

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

但是当我想映射我的参数时,我收到一个错误,说

无法使用
SELECT .... WHERE Colon IN ?

感谢您的帮助

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

您可以使用表达式来实现这一点

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

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

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

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

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

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

  • 在"查找转换"编辑器上,选择"General"页上的"Redirect Rows to No Match Output"选项。
  • 在"Connection"选项卡中,为包含将用于执行查找(按 ID 筛选)的表的数据库选择 OLE DB 连接管理器。 我建议使用 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

相关内容

最新更新