根据表中记录的变化情况自动维护作业

博客给出了一个SQL作业处理实例,根据sendTab的SendTime定制作业,作业完成可自动删除。包含测试表创建、存储过程、触发器的创建代码,还有插入、修改、删除数据的测试代码,最后进行了删除测试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**//*--作业处理实例

根据sendTab的SendTime定制作业
并且在该作业完成时,可以自动删除作业
--邹建2004.04(引用请保留此信息)--
*/


--示例

--测试表
CREATETABLEdbo.sendTab(
ID
intIDENTITY(1,1),
Name
nvarchar(10),
SendTime
datetime,
AcceptUnit
varchar(10),
SendUnit
varchar(10),
Content
nvarchar(4000)
)

CREATETABLEdbo.accepteTab(
ID
intIDENTITY(1,1),
Name
nvarchar(10),
SendUnit
varchar(10),
AcceptUnit
varchar(10),
Content
nvarchar(4000)
)
GO

--创建处理的存储过程
CREATEPROCdbo.p_JobSet
@idint,--要处理的sendTab的id
@is_deletebit=0--是否仅删除,为0则否,为1则是
AS
DECLARE
@dbnamesysname,
@jobnamesysname,
@dateint,
@timeint

--job名称及运行时间
SELECT
@jobname=N'定时发送作业_'+CAST(@idasnvarchar),
@date=CONVERT(varchar,SendTime,112),
@time=REPLACE(CONVERT(varchar,SendTime,108),':','')
FROMdbo.sendTab
WHEREid=@id

--如果job已经存在,则删除
IFEXISTS(
SELECT1FROMmsdb.dbo.sysjobs
WHEREname=@jobname)
EXECmsdb.dbo.sp_delete_job
@job_name=@jobname

IF@is_delete=1
RETURN

--创建job
EXECmsdb.dbo.sp_add_job
@job_name=@jobname,
@delete_level=1

--创建job步骤
DECLARE
@sqlvarchar(800)
SELECT
@sql=N'--job要实现的操作
INSERTdbo.accepteTab(
name,SendUnit,AcceptUnit,Content)
SELECT
name,AcceptUnit,SendUnit,Content
FROMdbo.sendTab
WHEREid=
'
+CAST(@idasvarchar),
@dbname=DB_NAME()

EXECmsdb.dbo.sp_add_jobstep
@job_name=@jobname,
@step_name=N'发送处理步骤',
@subsystem='TSQL',
@database_name=@dbname,
@command=@sql,
@retry_attempts=5,--重试次数
@retry_interval=5--重试间隔

--创建调度
EXECmsdb.dbo.sp_add_jobschedule
@job_name=@jobname,
@name=N'时间安排',
@enabled=1,
@freq_type=1,
@active_start_date=@date,
@active_start_time=@time

--添加目标服务器
EXECmsdb.dbo.sp_add_jobserver
@job_name=@jobname,
@server_name=N'(local)'
go

--创建处理的触发器(新增/修改)
CREATETRIGGERtr_insert_update
ONdbo.sendTab
FORINSERT,UPDATE
AS
DECLARE
@idint
DECLAREtbCURSORLOCAL
FOR
SELECT
id
FROMinserted
OPENtb
FETCHtbINTO@id
while@@fetch_status=0
BEGIN
EXECdbo.p_JobSet
@id=@id

FETCHtbINTO@id
END
CLOSEtb
DEALLOCATEtb
go

--创建处理的触发器(删除)
CREATETRIGGERtr_delete
ONdbo.sendTab
FORDELETE
AS
DECLARE
@idint
DECLAREtbCURSORLOCAL
FOR
SELECT
id
FROMdeleted
OPENtb
FETCHtbINTO@id
WHILE@@FETCH_STATUS=0
BEGIN
EXECdbo.p_JobSet
@id=@id,
@is_delete=1

FETCHtbINTO@id
END
CLOSEtb
DEALLOCATEtb
go

--测试(每个步骤做完后,可以看看job是否建立,在时间到之后,可以看看Job是否被自动删除,并且dbo.accepteTab是否有记录)

--a.插入数据
INSERTdbo.sendTab
SELECTN'文书1',DATEADD(s,1,GETDATE()),'UnitA','UnitB',N'txt'UNIONALL
SELECTN'文书2',DATEADD(d,1,GETDATE()),'UnitA','UnitB',N'txt'UNIONALL
SELECTN'文书3',DATEADD(m,1,GETDATE()),'UnitA','UnitB',N'txt'

--b.修改
UPDATEdbo.sendTabSET
name
=N'档案1',
SendTime
=DATEADD(s,5,GETDATE())
WHEREid=2

--c.删除
DELETEdbo.sendtab
WHEREid=3
GO

--删除测试
DROPTABLEdbo.sendTab,dbo.accepteTab
DROPPROCdbo.p_JobSet
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值