我想从Source (这将从其他地方获取数据)加载到Target的8个表的数据。我的源代码中有一个控制表,每次加载一个表时都会保留条目。所以在开始我的SSIS包之前,我需要检查源代码中的控制表是否包含所有8个表的条目。
RecordCount
(默认为0)& SQLQueryForRecordCount
(用于从控制表获取记录计数的SQL查询)RecordCount
execute sql script
相关联时,我选择了Expression as Evaluation Operation
和表达式为@[User::RecordCount] == 8
,以便在RecordCount = 8
时执行数据流。到目前为止一切正常。
问题是我们不确定何时将条目插入源中的控制表(可以在3小时窗口中随时进行)。所以我想循环第二步(执行sql脚本),直到RecordCount
变量值达到8,然后启动下一个数据流任务。
如何实现这一目标?请帮帮我。
答案 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
:
SQLCommand
检索RecordCount
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变量
旁注:您可以在Theading.Thread.Sleep(5000)
内添加While loop
命令,为每个命令执行提供更多时间