我在数据库中有一些订单ID。我想在另一个数据库中选择接受这些命令的行。
为了实现我的目标,我创建了一个SQL任务,以获取变量(对象)中的所有订单ID,并为每个循环添加一个数据流,以提取每个ID来请求ole db源。但是很长,我建立了很多联系。
我想绕过每个循环,并使用IN而不是=?通过where子句发出一个请求。
但是当我想映射我的参数时,我收到一条错误消息,指出无法使用
SELECT .... WHERE Colon IN ?
感谢您的帮助
答案 0 :(得分:2)
您将需要创建两个OLEDB源查询,然后在要用于IN子句的列上进行MERGE JOIN(使用INNER JOIN)。
答案 1 :(得分:1)
两个数据库都托管在同一SQL Server实例上吗?如果是这样,可以使用三个部分名称(例如Database.Schema.Table
)在初始查询中执行过滤。在下面的示例中,TABLE2
用于检查匹配的ID。在OLE DB源中将数据访问模式更改为SQL命令,然后可以使用此命名约定引用其他数据库(在同一服务器上)中的表。 INNER JOIN
用于仅返回TABLE1
中的匹配行。该问题并未表明ID列是否唯一,因此为了安全起见,我假设它不是唯一的,并且在子查询中使用DISTINCT
以确保仅返回唯一值。如果表位于不同服务器上的数据库中,则可以使用“查找转换”来仅返回源表中具有匹配ID的表中要进行查找的行。这将在下面进一步概述。
Redirect Rows to No Match Output
页上选择General
选项。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
答案 2 :(得分:1)
您可以使用Expression来实现这一目标。
在这个答案中,我假设您已将所有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]
。