我正在参加「掘金·启航计划」
假设有这样一个场景 创建一个储存过程A,它执行添加一条随机产生3到8位长度的域名记录,通过定时器T1每隔1秒执行一次存储过程A 创建另一个存储过程B,它执行统计域名的长度3到8的记录数,通过定时器T2每隔1秒执行一次存储过程B
- 效果
主要知识点列表
| 编号 | 语言或插件 | 知识点 | 说明 |
|---|---|---|---|
| 1 | sql | create table | 创建表关键词,比如:create table myName(字段1,字段2,) |
| 2 | sql | identity(1,1) | 自增长标识,一般用到两个参数,标识增量和标识种子 |
| 3 | sql | primary key | 主键标识 |
| 4 | sql | create proc | 创建存储过程关键词,proc是procedure缩写,也可以用完整词语 |
| 5 | sql | as | 一般用在别名,也有用到存储过程中的名称或参数之后,标志语句的开始 |
| 6 | sql | begin ... end | 相当于花括号,表示代码体 |
| 7 | sql | declare | 定义变量关键词,比如:declare @rows int,@rows是一个整数类型变量,set @rows=1,赋值操作 |
| 8 | sql | rand() | 随机函数,15位小数点,0.782169054626712 |
| 9 | sql | round() | 四舍五入,可指定保留小数点位数,round(rand()* 8,0),不保留小数点 |
| 10 | sql | while循环 | 没有for关键词,可以使用while实现,因为数据库专注于数据而不是编程,个人猜测只需要保留一个能够实现循环的关键词即可,没必要那么多 |
| 11 | sql | if | 逻辑条件判断 |
| 12 | sql | count() | 统计函数,比如:统计记录行数 |
| 13 | sql | insert into ... values() | 添加记录关键词,配合values一起使用 |
| 14 | sql | getdate() | 获取当前时间值 |
| 15 | sql | getutcdate() | 获取当前UTC国际标准时间值,如果是国外项目,那么utc时间比较适合,方便统一转为当地时间 |
【简单了解下存储过程】
1)Ta是语句集
2)只需要编译一次即可重复调用
3)一般大型数据库中都会有存储过程的功能
4)是数据库中的一个重要对象
5)指定一个存储过程名称以及输入或输出参数,和方法一样
6)特大数据量的情况下,使用它可以提升效率
7)可以直接在数据库中调用,也可以通过C#、java、php等语言调用
【存储过程的特点】
1)预编译
已经编译在数据库中,每次直接通过名称调用即可,比执行普通sql语句效率要高,复用性高
2)外网调用省流量
如果每次都是传递数百数千行sql语句,那么肯定会需要一定的流量消耗,特别是多访问的情况下,消耗会更多,特别是按流量计费。
存储过程就可以直接传一个名字和参数就减少了很多流量
3)高维护
修改内容时,只需要修改一个地方即可
4)高安全
可针对某一个用户进行身份限制
【创建表】
创建一张域名表,用于保存随机生成的域名记录
create table domain_table(
id int identity(1,1) primary key,
domain_value varchar(50),
domain_length int,
title varchar(100),
describe varchar(500),
create_time datetime
)
【创建存储过程】
create procedure createDomainValue
as
begin
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
需要注意的地方
1)拼接字符串,必须先定义字符串变量并初始化,如下
declare @domain_value varchar(50)
set @domain_value=N''
【调用存储过程】
通过存储过程的名称来调用,并查询记录是否执行成功
exec createDomainValue
select * from domain_table