长话短说,我需要使用SSIS在Netezza中创建一个序列。
我计划创建一个通用包,该包将查找某些表,并基于自然键和源,它将返回替代键(如果存在)或创建一个新键,然后将其返回给调用SSIS包。
此软件包将由多个SSIS软件包调用,每个来源一个。我的问题是,它们可能同时运行,并同时调用此程序包,这可能导致代理键中的唯一性问题。
有什么建议吗?
谢谢
答案 0 :(得分:0)
创建子(查找)包,然后通过执行该包的单个步骤创建一个SQL Agent Job。然后,您的父包可以执行作业,而不是直接执行该包。 SQL代理将负责“锁定”程序包,因为作业只能运行一个实例。
您可能需要构建某种等待机制。您可以查询msdb.dbo.sysjobactivity
以确定作业是否正在运行。
我最近建立了一个程序包,该程序包几乎可以完成您要尝试执行的操作。最终结果如下所示:
在第一步“执行SQL”中,我得到JobId和步骤名称。被调用的proc使用以下查询(我传入@JobName):
SELECT @JobId = job_id
FROM msdb.dbo.sysjobs
WHERE name = @JobName
然后,Is the job running
执行SQL任务执行以下查询以检查作业是否正在运行:
DECLARE @JobId UNIQUEIDENTIFIER
SET @JobId = ?
SELECT
Running =
CASE
WHEN start_execution_date IS NOT NULL AND stop_execution_date IS NULL
THEN 1
ELSE 0
END
FROM msdb.dbo.sysjobactivity
WHERE job_id = @JobId
我将值保存到变量,然后启用和禁用适当的路径。如果作业正在运行,我将等待30秒,然后Wait while job is running
循环会重新启动并再次检查作业活动状态。
放置了1秒的等待时间,以便给db引擎足够的时间来更新作业活动表。我的程序包失败,因为它执行检查的速度太快,并认为可以启动下一个作业执行。通过暂时暂停,我们可以在检查作业活动状态时获得准确的结果。
程序包到达Start Job Step
后,它将执行以下查询以启动工作:
DECLARE @step VARCHAR(100)
,@Job VARCHAR(100)
SET @step = ?
SET @Job = ?
EXEC msdb.dbo.sp_start_job @job_id = @job, @step_name = @step
如果您的情况是您不需要指定步骤,因为您的查找包作业将只包含一个步骤。