加入收藏 | 设为首页 | 会员中心 | 我要投稿 东莞站长网 (https://www.0769zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql – 根据来自另一个数据库的查询结果查询数据库

发布时间:2021-01-16 13:12:20 所属栏目:MsSql教程 来源:网络整理
导读:我在VS 2013中使用SSIS. 我需要从1个数据库中获取ID列表,并且使用该ID列表,我想查询另一个数据库,即SELECT …来自MySecondDB WHERE ID IN({MyFirstDB中的ID列表}). 解决方法 有3种方法可以实现这一目标: 第一种方法 – 使用查找转换 首先,您需要添加一个像@T

我在VS 2013中使用SSIS.
我需要从1个数据库中获取ID列表,并且使用该ID列表,我想查询另一个数据库,即SELECT …来自MySecondDB WHERE ID IN({MyFirstDB中的ID列表}).

解决方法

有3种方法可以实现这一目标:

第一种方法 – 使用查找转换

首先,您需要添加一个像@TheEsisia一样的查找转换,但还有更多要求:

>在查找中,您必须编写包含ID列表的查询(例如:来自MyFirstDB WHERE的SELECT ID …)
>至少你必须从查找表中选择一列
>这些不会过滤行,但这会从第二个表中添加值

要过滤行WHERE ID IN({MyFirstDB中的ID列表}),您必须在查找错误输出中做一些工作错误情况有两种方法:

>将错误处理设置为忽略行,以便添加的列(来自查找)值为空,因此您必须添加一个条件拆分,用于筛选值等于NULL的行.

假设您已选择col1作为查找列,因此您必须使用类似的表达式

ISNULL([col1]) == False

>或者您可以将错误处理设置为重定向行,因此所有行都将被发送到错误输出行(可能不会使用),因此将过滤数据

该方法的缺点是在执行期间加载和过滤所有数据.

此外,如果在加载所有数据后在本地计算机(服务器上的第二个方法)上进行网络过滤,则为内存.

第二种方法 – 使用脚本任务

为避免加载所有数据,您可以执行一种解决方法,您可以使用脚本任务实现此目的:(回答在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命令)

第三种方法 – 使用Execute Sql Task

与第二种方法类似,但这将使用执行SQL任务构建IN子句,然后将整个查询用作OLEDB源,

>只需在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

确保已将DataFlow Task Delay Validation属性设置为True

(编辑:东莞站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读