我在数据库中有一些订单ID。我希望在另一个数据库中选择这些命令的le行。
为了实现我的目标,我创建了一个SQL任务来获取变量(对象)中的所有订单id,并为每个循环我包含数据流以提取每个id以放入我的ole db源的请求。但它很长,我建立了很多联系。
我想绕过这个循环,并使用IN而不是=?使用where子句发出一个请求?
但是当我想要映射我的参数时,我得到一个错误,说它不可能使用
SELECT .... WHERE Colon IN ?
谢谢你的帮助
您需要创建两个OLEDB源查询,然后在要用于IN子句的列上使用MERGE JOIN(使用INNER JOIN)。
您可以使用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]
。
两个数据库是否都托管在同一个SQL Server实例上?如果是这样,可以使用三个部分名称在初始查询中执行过滤,例如Database.Schema.Table
。在下面的示例中,TABLE2
用于检查匹配的ID。在OLE DB源中将数据访问模式更改为SQL命令,然后您可以使用此命名约定引用其他数据库(在同一服务器上)中的表。 INNER JOIN
用于仅返回TABLE1
中匹配的行。问题没有表明ID列是否是唯一的,所以为了安全起见我假设它不是,并且在子查询中使用DISTINCT
以确保仅返回唯一值。如果表位于不同服务器上的数据库中,则可以使用查找转换仅返回源表中的行,并在执行查找的表中使用匹配的ID。这在下面进一步概述。
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