现在的背景如下,在服务器上建立了一个数据库,对其中的部分表建立合并复制,供PDA同步下载。但是该数据库中的部分表由于记录量很大。因此不能全部下载,为此针对这部分表建立辅助表。 将辅助表作为PDA下载同步的表。
例如现在主表Main字段如下
serial dno checkdate udate
自增字段 设备编号 检查日期 修改日期
1 A XXXXX XXXXX
2 A XXXXX XXXXX
3 B XXXXX XXXXX
内容大致如上辅助表Follow字段如下
serial dno checkdate udate
内容由主表查询后插入现在要求每天晚上12:00查询主表满足当前日期3年内,每个设备的前100条记录插入到辅助表。
并且辅助表已有记录不需要插入,不符合的记录删除,同时辅助表每个设备编号拥有的记录数最多100.
大家都有什么好的思路,来满足这个需求谢谢
例如现在主表Main字段如下
serial dno checkdate udate
自增字段 设备编号 检查日期 修改日期
1 A XXXXX XXXXX
2 A XXXXX XXXXX
3 B XXXXX XXXXX
内容大致如上辅助表Follow字段如下
serial dno checkdate udate
内容由主表查询后插入现在要求每天晚上12:00查询主表满足当前日期3年内,每个设备的前100条记录插入到辅助表。
并且辅助表已有记录不需要插入,不符合的记录删除,同时辅助表每个设备编号拥有的记录数最多100.
大家都有什么好的思路,来满足这个需求谢谢
create proc sp_job
as
set nocount on
insert Follow select * from Main t where not exists(select 1 from Follow where serial=t.id)
delete Follow where 条件
set nocount off
go
2.在作业里面调用该存储过程,设定调用时间。
1、管理->SQL Server代理->作业(按鼠标右键)->新建作业-> 2、新建作业属性(常规)->名称[自定义本次作业的名称]->启用的方框内是勾号-> 分类处可选择也可用默认的[未分类(本地)]->所有者默认为登录SQL Server用户[也可选其它的登录]-> 描述[填写本次工作详细描述内容]; [ 创建作业分类的步骤: SQL Server代理->作业->右键选所有任务->添加、修改、删除 ] 3、新建作业属性(步骤)->新建->步骤名[自定义第一步骤名称]->类型[Transact-SQL(TSQL)脚本]-> 数据库[要操作的数据库]->命令
[ 如果是简单的SQL直接写进去即可,也可用打开按钮输入一个已写好的*.sql文件
如果要执行存储过程,填
exec p_procedure_name v_parameter1,[ v_parameter2…v_parameterN]
]
->确定
(如果有多个步骤,可以再次调用下面的新建按钮;也可以对已有的多个步骤插入、编辑、删除); 4、建作业属性(调度)->新建调度->名称[自定义调度名称]->启用的方框内是勾号->调度->反复出现-> 更改[调度时间表]->确定
(如果只要保存此作业,不要定时做可以把启用的方框内是勾号去掉); 5、建作业属性(通知)->用默认的通知方法就好[当作业失败时,写入Windows应用程序系统日志] ->确定。 跟作业执行相关的一些SQL Server知识: SQLSERVERAGENT服务必须正常运行,启动它的NT登录用户要跟启动SQL Server数据库的NT登录用户一致。 点作业右键可以查看作业执行的历史记录情况,也可以立即启动作业和停止作业。
最近在看作业历史记录时,发现有的作业记录的历史记录多,有的作业记录的记录的历史记录少. 如何能使某些作业按各自的需求,保留一段时间.比如保留一个月的历史记录. 看了SQL Server的在线帮助文档,里面介绍说: 在管理->SQL Server代理->右键选属性->作业系统->限制作业历史记录日志的大小-> 作业历史记录日志的最大大小(行数) 默认为1000 如果某台机器的作业数量很多,一定要提高它,例如为100000 每个作业历史记录日志的最大行数 默认为100 如果作业每天执行两次,需要保留一个月的日志,可以设为60 它们之间有一个相互制约关系, 我们可以根据自己的需要来改. 如果SQL Server服务器改过机器名, 管理是旧名称时建立的job的时候可能会遇到 错误14274: 无法添加、更新或删除从MSX服务器上发起的作业(或其步骤或调度) 看了Microsoft的文档:http://support.microsoft.com/default.aspx?scid=kb;en-us;281642 说SQL Server 2000系统里msdb..sysjobs 里originating_server 字段里存的是原来的服务器的名称. 24X7在用的系统肯定不能按上面Microsoft的文档说的那样把名字改回来又改过去。 于是想,msdb..sysjobs 能否update originating_server 字段成现在在用的新服务器名?use msdbselect * from sysjobs 找到originating_server 字段还是旧服务器的job_id, 然后执行update语句:update sysjobs set originating_server='new_server_name'
where job_id='B23BBEBE-A3C1-4874-A4AB-0E2B7CD01E14' (所影响的行数为 1 行) 这样就可以添加、更新或删除那些曾经出error 14274 的作业了。
如果想把作业由一台机器迁移到另一台机器,可以先保留好创建作业的脚本, 然后在另一台机器上运行。 导出所有作业的创建脚本操作步骤: 管理->SQL Server代理->作业(鼠标右键)->所有任务->生成SQL脚本->保存到操作系统下的某个sql文件 导出某一个作业的创建脚本操作步骤:
管理->SQL Server代理->作业->选中待转移的作业(鼠标右键)->所有任务->生成SQL脚本->保存到OS下的某个sql文件 然后在目的服务器上运行刚才保存下来的创建作业的sql脚本。 ( 如果建作业的用户或者提醒的用户不存在, 则会出错; 我们需要在目的服务器上建立相关的WINDOWS用户或者SQL Server数据库登录, 也可以修改创建作业的脚本, 把目的服务器上不存在的用户替换成已经有的用户。
如果生成日志的物理文件目录不存在,也应该做相关的修改,例如d:\区转f:\区等
字符串的 @command 命令里有分隔符号 go 也会出错, 可以把它去掉)
http://so.csdn.net/BlogSearchResult.aspx?q=sql+job&p=0
drop procedure [dbo].[Pro_AddTask]
GO
create proc Pro_AddTask
@taskname varchar(100), --task name
@sql varchar(8000), --slq command
@dbname sysname='', -- default the current db
@freqtype varchar(6)='day', --the frequence of time :month ,week ,day
@freqsubtype varchar(6)='no' ,--no, hour ,minute
@fqinterval int=1, --the execute times
@fqsubinterval int=1, --the sub interval
@time int=000000 -- execute on some time format(hhmmss)
as
/*--creat task
--author:sky 2008.02.27
discription:
when @freqtype='week' when @fqinterval=
1 = 星期日
2 = 星期一
4 = 星期二
8 = 星期三
16 = 星期四
32 = 星期五
64 = 星期六
*/
/*--eg.
--每月执行的作业
exec Pro_AddTask @taskname='mm',@sql='seleCT * from syscolumns',@freqtype='month'
--每周执行的作业
exec Pro_AddTask @taskname='ww',@sql='select * from syscolumns',@freqtype='week'
--每日00000执行的作业
exec Pro_AddTask @taskname='ab',@sql='select * from syscolumns'
--每日12:00:00作业
exec Pro_AddTask @taskname='d12',@sql='select * from syscolumns',@time=12000
--每周六12:00:00作业
exec Pro_AddTask @taskname='w12',@sql='select * from syscolumns',@freqtype='week',@fqinterval=64,@time=12000
--每月20号12:00:00作业
exec Pro_AddTask @taskname='m20',@sql='select * from syscolumns',@freqtype='month',@fqinterval=20,@time=12000
--*/
if isnull(@dbname,'')='' set @dbname=db_name()
--create task
exec msdb..sp_add_job @job_name=@taskname --create task step
exec msdb..sp_add_jobstep @job_name=@taskname,
@step_name = 'data process',
@subsystem = 'TSQL',
@database_name=@dbname,
@command = @sql,
@retry_attempts = 5,
@retry_interval = 5
--create schedule
declare @ftype int,@fstype int,@ffactor int
select @ftype=case @freqtype
when 'day' then 4
when 'week' then 8
when 'month' then 16
end
,@fstype=case @freqsubtype
when 'no' then 1
when 'hour' then 4
when 'minutue' then 8
else 0
end
set @ffactor=case @freqtype when 'day' then 0 else 1 end
EXEC msdb..sp_add_jobschedule @job_name=@taskname,
@name = 'schedule',
@freq_type=@ftype , ---4 每天,8 每周,16 每月
@freq_interval=@fqinterval, --作业执行的天数
@freq_subday_type=@fstype, --是否重复执行,0x1 在指定的时间, 0x4 分钟, 0x8 小时
@freq_subday_interval=@fqsubinterval, --重复周期
@freq_recurrence_factor=@ffactor, --重复执行,则设置为1,否则设置为0
@active_start_time=@time --下午00:00:00分执行
-- add the goal server
EXEC msdb.dbo.sp_add_jobserver
@job_name = @taskname ,
@server_name = N'(local)'用心对待身边的一切,一切皆有可能!