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

原创 2004年08月07日 22:22:00

 

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

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


--示例

--测试表
CREATE TABLE dbo.sendTab(
    ID 
int IDENTITY(1,1),
    Name 
nvarchar(10),
    SendTime 
datetime,
    AcceptUnit 
varchar(10),
    SendUnit 
varchar(10),
    Content 
nvarchar(4000)
)

CREATE TABLE dbo.accepteTab(
    ID 
int IDENTITY(1,1),
    Name 
nvarchar(10),
    SendUnit 
varchar(10),
    AcceptUnit 
varchar(10),
    Content 
nvarchar(4000)
)
GO

--创建处理的存储过程
CREATE PROC dbo.p_JobSet
    
@id int,            --要处理的sendTab的id
    @is_delete bit=0    --是否仅删除,为0则否,为1则是
AS
DECLARE
    
@dbname sysname,
    
@jobname sysname,
    
@date int,
    
@time int

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

-- 如果 job 已经存在, 则删除
IF EXISTS(
        
SELECT 1 FROM msdb.dbo.sysjobs
        
WHERE name = @jobname)
    
EXEC msdb.dbo.sp_delete_job
            
@job_name = @jobname 

IF @is_delete = 1
    
RETURN

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

-- 创建 job 步骤
DECLARE
    
@sql varchar(800)
SELECT
    
@sql = N' -- job 要实现的操作
INSERT dbo.accepteTab(
    name,SendUnit,AcceptUnit,Content)
SELECT
    name,AcceptUnit,SendUnit,Content
FROM dbo.sendTab
WHERE id = 
' 
        
+ CAST(@id as varchar),
    
@dbname = DB_NAME()

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

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

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

-- 创建处理的触发器(新增/修改)
CREATE TRIGGER tr_insert_update 
    
ON dbo.sendTab
FOR INSERT,UPDATE
AS
DECLARE 
    
@id int
DECLARE tb CURSOR LOCAL
FOR
SELECT
    id
FROM inserted
OPEN tb
FETCH tb INTO @id
while @@fetch_status=0
BEGIN
    
EXEC dbo.p_JobSet
        
@id = @id
    
    
FETCH tb INTO @id
END
CLOSE tb
DEALLOCATE tb
go

-- 创建处理的触发器(删除)
CREATE TRIGGER tr_delete
    
ON dbo.sendTab
FOR DELETE
AS
DECLARE
    
@id int
DECLARE tb CURSOR LOCAL
FOR
SELECT
    id
FROM deleted
OPEN tb
FETCH tb INTO @id
WHILE @@FETCH_STATUS=0
BEGIN
    
EXEC dbo.p_JobSet
        
@id = @id,
        
@is_delete = 1

    
FETCH tb INTO @id
END
CLOSE tb
DEALLOCATE tb
go

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

-- a. 插入数据
INSERT dbo.sendTab
SELECT N'文书1'DATEADD(s, 1GETDATE()), 'UnitA''UnitB', N'txt' UNION ALL
SELECT N'文书2'DATEADD(d, 1GETDATE()), 'UnitA''UnitB', N'txt' UNION ALL
SELECT N'文书3'DATEADD(m, 1GETDATE()), 'UnitA''UnitB', N'txt'

-- b. 修改
UPDATE dbo.sendTab SET
    name 
= N'档案1',
    SendTime 
= DATEADD(s, 5GETDATE())
WHERE id = 2

-- c. 删除
DELETE dbo.sendtab
WHERE id = 3
GO

-- 删除测试
DROP TABLE dbo.sendTab, dbo.accepteTab
DROP PROC dbo.p_JobSet

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

/*--作业处理实例?根据sendTab的SendTime定制作业?并且在该作业完成时,可以自动删除作业--*/--示例--测试表create table sendTab(ID int identit...
  • chenzhiya
  • chenzhiya
  • 2008年01月03日 15:14
  • 145

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

 /*--作业处理实例?根据sendTab的SendTime定制作业?并且在该作业完成时,可以自动删除作业--*/--示例--测试表create table sendTab(ID int identi...
  • fuzhouxufeng
  • fuzhouxufeng
  • 2008年12月04日 15:28
  • 268

根据表中的纪录变化,自动维护作业

*--作业处理实例 ?根据sendTab的SendTime定制作业 ?并且在该作业完成时,可以自动删除作业 --*/ --示例 --测试表 create table sendTab(ID int id...
  • amylis
  • amylis
  • 2005年11月30日 23:11
  • 370

sap表格维护生成器生成数据表维护视图程序

问题:新建的视图维护数据,在开发或测试都可以正常维护数据。但传到800后,sm30维护数据提示:客户800有"不可修改"的状态 解决:表格维护生成器,原因为:对话数据传输明细 默认标准记录例程 更改...
  • march_c
  • march_c
  • 2013年11月27日 08:54
  • 706

Oracle 11g New 自动维护任务以及I/O校准

自动维护任务 维护窗口 Oracle Database 10g提倡在维护窗口期间执行自动维护任务。自动任务包括统计信息收集、段指导和自动SQL 优化。 在Oracle Datab...
  • rlhua
  • rlhua
  • 2013年11月20日 10:34
  • 3147

kettle中给ktr作业设置日志

原文地址:http://www.cnblogs.com/wxjnew/archive/2013/05/23/3095018.html 目的,无论是本地的.ktr文件或者是资源库的kt...
  • yu8196378
  • yu8196378
  • 2016年06月28日 15:58
  • 1038

ORACLE查询表最近更改的数据记录

我们在plsql中修改GIS_Camera_Rename相关信息 原始数据记录 修改后的数据记录 在这里我们可以看到city字段里分别添加QQQ属性 我们可以通过语句查询该表的修改记录...
  • nj198624
  • nj198624
  • 2012年11月07日 05:45
  • 4173

在表维护生成器中添加F4及自动带出描述

自动带出描述的代码:SELECT SINGLE NAME1 INTO ZPM004-NAME1 FROM T001W WHERE WERKS = ZPM004-IWERK AND ...
  • liupengpeng1109
  • liupengpeng1109
  • 2015年12月18日 11:19
  • 686

关于Kettle 转换、作业日志自动配置的解决方案

在一个项目中,一般情况下Kettle所有的转换和作业日志应该集中放在一起,便于管理和维护。但在使用Kettle的过程中,发现每次新配置一个转换或作业的时候,转换或作业的日志需要重新配置一次,感觉比较麻...
  • littlecaesar1234
  • littlecaesar1234
  • 2014年01月22日 11:22
  • 2450

MySQL表维护语句

1 简介 MySQL支持几条与维护和管理数据库相关的语句。例如:使用其中一条,可以修复一个损坏的表,使用另一条,可以检查一个表的索引是否正确。通常,数据库管理员而不是开发者使用这些语句。 ...
  • JesseYoung
  • JesseYoung
  • 2014年07月28日 13:20
  • 1730
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:根据表中记录的变化情况自动维护作业
举报原因:
原因补充:

(最多只允许输入30个字)