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

时间:2017-05-25 20:10:54

标签: sql-server ssis sql-server-2012 etl ssis-2012

背景

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

SSIS包结构

  1. 两个变量RecordCount(默认为0)& SQLQueryForRecordCount(用于从控制表获取记录计数的SQL查询)
  2. 执行SQL任务 - 这里我执行select查询以获取记录计数并将结果传递给变量RecordCount
  3. 在将数据流与execute sql script相关联时,我选择了Expression as Evaluation Operation和表达式为@[User::RecordCount] == 8,以便在RecordCount = 8时执行数据流。
  4. 到目前为止一切正常。

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

    如何实现这一目标?请帮帮我。

2 个答案:

答案 0 :(得分: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开始。不需要任何限制。

答案 1 :(得分:2)

脚本任务解决方法

您可以使用Script Task代替Execute SQL Task

来解决方法
  1. 在“脚本任务”中,使用SQLCommand检索RecordCount
  2. 添加一个While循环,重复执行SqlCommand直到RecordCount = 8
  3. 您的代码应如下所示:

    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
    
  4. 最后将计数值分配给recordCount变量

  5. 注意:您必须在脚本编辑器中将User::RecordCount作为ReadWriteVariable添加为User::SQLQueryForRecordCount作为ReadOnly变量

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