【数据库】Sql Server存储过程通过定时执行添加记录作业

430 阅读3分钟

我正在参加「掘金·启航计划」

通过上篇了解了什么是存储过程,创建存储过程的方法,以及调用存储过程的方法 本次将通过数据库中的作业功能,进行定时执行存储过程,这样就可以完成我们刚开始假设的场景

  • 定时任务效果 image.png

主要知识点列表

编号语言或插件知识点说明
1sql作业包含步骤、计划、警告等
2sql步骤执行sql语句或存储过程的主要命令操作
3sql计划定时任务的主要设置,可灵活设置按日、周、月等执行
4sql间隔10秒这里的定时最低间隔10秒执行一次,这里涉及到数据库执行成本问题,如果发布订阅是实时的,会非常耗资源,所以会有一定的最小间隔时间

【什么是数据库中的作业功能】

1)定时或者每隔一段时间执行某个存储过程
2)执行的sql语句在3200字符以内

【作业类别】

编号类别备注
1未分类(本地)
2数据收集器
3数据库引擎优化顾问
4数据库维护
5日志传送
...

【新建作业步骤】

1)打开Sql server可视化工具,Management Studio
2)选择管理>SQL Server代理
image.png

3)从上图可知,被禁用了
4)打开配置管理器
找不到配置管理器解决方法 2008:SQLServerManager10.msc
2012:SQLServerManager11.msc
2014:SQLServerManager12.msc
5)启动代理
image.png 6)再打开查看 image.png 7)鼠标右键SQL Server代理
新建 > 作业
8)填写基本信息

  • 常规 名称:auto_add_domain_record
    勾选启用
    9)新建步骤
    填写步骤名称,关键是命令区域的命令语句,填写如下执行存储过程代码,增加两个输入参数,起始值和结束值
exec createDomainValue 1,100

1654488633672.png 10)选择计划选项,设置定时执行时间
最低只能每隔10秒执行一次,没法假设100毫秒执行一次 image.png 从10的整数倍开始执行 image.png

【提高添加记录】

通过上面的操作和分析,我们可以知道,最低间隔10秒执行一次添加,这个和我们假设的场景有点差距。
10秒添加一条记录,1分钟60秒,只会生成6条记录,1小时=60分钟=60 * 6=360条,1=24小时=24 * 60 * 6=8640,一天才8千多条记录

  • 解决方案
    1)创建多个作业(不可行)
    2)在一个作业和一个计划的基础上,创建多个步骤来实现10秒内添加多条记录(不可行) 3)在存储过程里,每次快速循环生成1000条记录 一天86400秒,乘以100倍,就是860万条记录一天
USE [test]
GO
/****** Object:  StoredProcedure [dbo].[createDomainValue]    Script Date: 06/06/2022 13:05:35 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER procedure [dbo].[createDomainValue]
@count int,
@count_max int
as
begin 
	
	while @count<=@count_max
	begin
		set @count+=1
		declare @rows int
		declare @index int
		declare @length int
		declare @str varchar(50)
		declare @domain_value varchar(50)
		declare @random int
		declare @temp varchar(50)

		set @domain_value=N'' --拼接字符串,必须先初始化
		set @index=1
		set @str='abcdefghijklmnopqrstuvwxyz0123456789'
		set @length=3+round(rand()*5,0)

		while @index<=@length
		begin
			set @random=round(rand()*34,0) --0~35随机下标
			set @temp=substring(@str,@random,1) --截取1位长度值\
			set @domain_value+=@temp 
			set @index+=1
		end

		--随机产生域名,此处域名组合使用顶级的国际域名
		declare @full_domain varchar(50)
		set @full_domain='www.'+@domain_value+'.com'

		--查询记录是否存在,不存在则添加,存在则不做任何操作
		select @rows=count(1) from domain_table where domain_value=@full_domain
		if @rows<=0
		begin
			insert into domain_table(domain_value,domain_length,create_time)
			values(@full_domain,@length,getdate())
		end
	end
end