有3种方法可以实现:
第一种方法 - 使用查找转换
首先你必须添加一个Lookup Transformation 就像@TheEsisia 回答但还有更多要求:
要过滤行WHERE ID IN ({list of IDs from MyFirstDB}),您必须在查找错误输出Error case 中做一些工作,有两种方法:
- 将错误处理设置为
Ignore Row,因此添加的列(来自查找)的值为 null ,因此您必须添加一个Conditional split 来过滤值等于NULL 的行。
假设您已选择 col1 作为查找列,因此您必须使用类似的表达式
ISNULL([col1]) == False
- 或者你可以将错误处理设置为
Redirect Row,这样所有的行都会被发送到错误输出行,可能不会被使用,所以数据会被过滤
这种方法的缺点是所有数据都是在执行过程中加载和过滤的。
此外,如果在加载所有数据后在本地计算机上进行网络过滤(服务器上的第二种方法)是内存。
第二种方法 - 使用脚本任务
为避免加载所有数据,您可以采取一种解决方法,您可以使用脚本任务来实现:(在 VB.NET 中编写的答案)
假设连接管理器名称为TestAdo,"Select [ID] FROM dbo.MyTable" 是获取id 列表的查询,User::MyVariableList 是要存储id 列表的变量
注意:此代码将从连接管理器读取连接
Public Sub Main()
Dim lst As New Collections.Generic.List(Of String)
Dim myADONETConnection As SqlClient.SqlConnection
myADONETConnection = _
DirectCast(Dts.Connections("TestAdo").AcquireConnection(Dts.Transaction), _
SqlClient.SqlConnection)
If myADONETConnection.State = ConnectionState.Closed Then
myADONETConnection.Open()
End If
Dim myADONETCommand As New SqlClient.SqlCommand("Select [ID] FROM dbo.MyTable", myADONETConnection)
Dim dr As SqlClient.SqlDataReader
dr = myADONETCommand.ExecuteReader
While dr.Read
lst.Add(dr(0).ToString)
End While
Dts.Variables.Item("User::MyVariableList").Value = "SELECT ... FROM ... WHERE ID IN(" & String.Join(",", lst) & ")"
Dts.TaskResult = ScriptResults.Success
End Sub
并且User::MyVariableList应该用作源(变量中的Sql命令)
第三种方法 - 使用执行 Sql 任务
类似于第二种方法,但这将使用Execute SQL Task 构建IN 子句,然后将整个查询用作OLEDB Source,
- 只需在 DataFlow 任务之前添加一个执行 SQL 任务
- 将
ResultSet 属性设置为single
- 选择
User::MyVariableList作为结果集
-
使用以下 SQL 命令
DECLARE @str AS VARCHAR(4000)
SET @str = ''
SELECT @str = @str + CAST([ID] AS VARCHAR(255)) + ','
FROM dbo.MyTable
SET @str = 'SELECT * FROM MySecondDB WHERE ID IN (' + SUBSTRING(@str,1,LEN(@str) - 1) + ')'
SELECT @str
如果该列是字符串数据类型,您应该在值之前和之后添加引号,如下所示:
SELECT @str = @str + '''' + CAST([ID] AS VARCHAR(255)) + ''','
FROM dbo.MyTable
确保您已将 DataFlow Task Delay Validation 属性设置为 True