首页 文章

检查数据库表中的条目后运行SSIS包

提问于
浏览
3

背景

我想从Source(这从其他地方获取数据)加载8个表的数据到Target . 我的源代码中有一个控制表,每次加载一个表时都会保留条目 . 所以在开始我的SSIS包之前,我需要检查源代码中的控制表是否包含所有8个表的条目 .

SSIS包结构

  • 两个变量 RecordCount (默认为0)& SQLQueryForRecordCount (用于从控制表获取记录计数的SQL查询)

  • 执行SQL任务 - 这里我执行select查询以获取记录计数并将结果传递给变量 RecordCount

  • 使用 execute sql script 连接数据流时,我选择了 Expression as Evaluation Operation 和表达式为 @[User::RecordCount] == 8 ,以便在 RecordCount = 8 时执行数据流 .

到目前为止一切正常 .

问题是我们不确定何时将条目插入源中的控制表(可以在3小时窗口中随时进行) . 所以我想循环第二步(执行sql脚本),直到 RecordCount 变量值达到8,然后启动下一个数据流任务 .

怎么做到这一点?请帮我 .

2 回答

  • 3

    我发现在存储过程中更容易做到这一点,并且更喜欢调整它而无需编辑/部署/推广我的包 .

    在SSIS中,您将需要一个调用存储过程的简单执行SQL任务 . 然后对于存储过程,您需要以下内容:

    DECLARE @CountProcessed int
    
    SELECT @CountProcessed = SUM(ControlField)
    FROM ControlTable
    
    WHILE @CountProcessed <> 8
       BEGIN
         WAITFOR DELAY 00:01:00 --Set to whatever time increment you want to wait
         SELECT @CountProcessed = SUM(ControlField)
         FROM ControlTable
       END
    

    然后,您可以丢弃您的SSIS变量,只需从此proc开始 . 不需要任何限制 .

  • 2

    脚本任务解决方法

    您可以使用 Script Task 而不是 Execute SQL Task 执行变通方法:

    • 在脚本任务中使用 SQLCommand 来检索 RecordCount

    • 添加一个While循环,重复 SqlCommand 执行,直到 RecordCount = 8

    • 您的代码应如下所示:

    Dim recordcount As Integer = 0
    Dim sqlQuery As String = ""
    Public Sub Main()
    
        sqlQuery = Dts.Variables.Item("User::SQLQueryForRecordCount ").Value.ToString
    
        Using sqlcon As New SqlClient.SqlConnection("Server=myServerName\myInstanceName;Database=myDataBase;Integrated Security=SSPI;")
    
            sqlcon.Open()
    
    
    
            While recordcount < 8
    
                Using sqlcmd As New SqlClient.SqlCommand(sqlQuery, sqlcon)
    
    
                    recordcount = CInt(sqlcmd.ExecuteScalar())
                    'Theading.Thread.Sleep(5000) wait for 5 seconds
    
                End Using
    
    
    
            End While
    
    
        End Using
    
        Dts.Variables.Item("User::RecordCount").Value = recordcount
    
        Dts.TaskResult = ScriptResults.Success
    End Sub
    
    • 最后将计数值分配给 recordCount 变量

    注意:您必须在脚本编辑器中将 User::RecordCount 添加为ReadWriteVariable,将 User::SQLQueryForRecordCount 添加为ReadOnly Variable

    附注:您可以在 While loop 中添加 Theading.Thread.Sleep(5000) 命令,为每个命令执行提供更多时间

相关问题