【问题标题】:Run SSIS Package after checking entries in database table检查数据库表中的条目后运行 SSIS 包
【发布时间】:2017-05-25 20:10:54
【问题描述】:

背景

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

SSIS 包结构

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

到目前为止一切正常。

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

如何做到这一点?请帮帮我。

【问题讨论】:

  • 如果有 3 小时的窗口时间,为什么不将包执行时间设置为在 3 小时结束时执行?
  • @TheEsisia 一般这种情况出现在有开始处理的窗口,但你还是想尽快开始...
  • 是的亚伦,你是对的。尽管有 3 小时的窗口,我们希望尽快开始将数据加载到下一个系统。

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


【解决方案1】:

我发现在存储过程中执行此操作更容易,并且更喜欢无需编辑/部署/提升我的包即可对其进行调整的能力。

在 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 变量,并简单地从这个过程开始。不需要约束。

【讨论】:

  • 嗨亚伦,非常感谢您的回复。这看起来是一个很好的解决方案。有什么方法可以在不使用过程的情况下在 SSIS 包中实现这一点。
  • @VenkatN 你当然可以(尽管出于我提到的可见性原因,我仍然强烈建议不要这样做)。您的下一个最佳选择是将上述内容放入执行脚本任务中,而不是构建一个过程并调用它。它将以相同的方式运行,但代码将存在于该任务中,而不是在您的数据库中。
【解决方案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变量

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

旁注:您可以在While loop 中添加Theading.Thread.Sleep(5000) 命令,以便为每个命令的执行留出更多时间

【讨论】:

  • 嗨哈迪,非常感谢您的回复。如何在 SqlConnection 中声明“Windows 身份验证”而不是密码。对不起,如果我问的是基本问题。这是我职业生涯中的第一个 VB 脚本。
  • 我创建了 VB 脚本,下图有详细信息:Script。运行包Error 时出现以下错误。请帮帮我。
  • @VenkatN 在连接字符串中您提供了一个没有实例的服务器名称,它应该看起来像myServerName\myInstanceName
  • 我们的服务器没有实例名称。如果实例名称为空,我们应该提供什么。
  • Server name 为机器名,instance 为sql server 实例。可以从execute sql任务中使用的oledb连接获取
猜你喜欢
  • 1970-01-01
  • 2013-10-09
  • 2017-04-02
  • 2014-04-21
  • 1970-01-01
  • 1970-01-01
  • 2021-09-18
  • 1970-01-01
  • 2011-10-26
相关资源
最近更新 更多