【新星计划回顾】第四篇学习计划-自定义函数、存储过程、随机值知识点

时间过的真快,这是导师回顾新星计划学习的第四篇文章!
最近这段时间非常忙,虽然导师首次参与新星计划活动已经在4月16日圆满结束,早想腾出时间来好好整理活动期间分享的知识点。
非常感谢大家的支持和活动期间的文章输出,导师也是忙里抽空给大家准备分享的内容,也是尽力了,所以分享的知识点主要是偏向于基础和基本的实战,虽然不是讲解的很系统,但是能够了解到一定的实战信息
期待我们的下次学习,导师将会在6月或者7月再次发起新星计划,本次活动也得到学员和平台的肯定,平台也是非常欢迎导师再次发起新星计划,非常感谢!

目录

  • 1、域名后缀
    • 1.1、后缀分类
    • 1.2、组成规则
  • 2、知识点
    • 2.1、函数分类
    • 2.2、自定义函数
      • 2.2.1、标量值函数
      • 2.2.2、表值函数
      • 2.2.3、修改函数
    • 2.3、存储过程
      • 2.3.1、创建无参数存储过程
      • 2.3.2、创建有参数存储过程
      • 2.3.3、修改存储过程
  • 3、模拟域名数据
    • 3.1、创建表
    • 3.2、创建函数取值范围
    • 3.3、随机获取数据
    • 3.4、随机长度和值
    • 3.5、创建函数域名中间值
    • 3.6、创建存储过程

  • 计划
    【新星计划回顾】第四篇学习计划-自定义函数、存储过程、随机值知识点_第1张图片

1、域名后缀

亦被称为顶级域名,是指代表一个域名类型的符号,不同后缀的域名有不同的含义。

1.1、后缀分类

域名共分为两类
1)国别域名:中国cn
2)国际通用域名:.com、.net等1000多种

  • 温馨提示
    后缀繁多,我们这里只模拟cn、com两种后面,且为顶级域名,其他后缀域名的含义感兴趣的学员可以了解下

1.2、组成规则

组成格式:协议(http/https)+域名等级(顶级域名/二级域名/三级域名)+域名组合(1到67位)+域名后缀
1)26个英文字母(没有大小写区分)
2)0~9,10个数字
3)下划线符号(不能出现在开头)

  • 温馨提示
    这里只针对顶级域名以及域名中间部分用字母和数字进行组合,且长度限制在2到18位长度域名,比如:https://www.csdn.net
    域名协议不进行保存,一般都是通过https进行访问

2、知识点

2.1、函数分类

常见的函数有如下几种:表值函数、标量值函数、聚合函数、系统函数。
这里只简单讲解【表值函数】和【标量值函数】
【新星计划回顾】第四篇学习计划-自定义函数、存储过程、随机值知识点_第2张图片

2.2、自定义函数

关键词:function
1)用于计算复杂逻辑,可以返回单个标量值或者结果集
2)能够接收传入参数,单不能输出传出参数
3)优点,模块化、执行速度更快、减少网络流量
如果在程序之间执行,特别是跨服务器数据库,每次需要把一大串执行sql语句通过网络传到目标服务器数据库是需要消耗比较大的流量,
所以定义成函数自然就减少了很多sql语句传送,直接就是一个函数名搞定

2.2.1、标量值函数

  • 代码
-- 创建标量值函数
go
    create function constData(@test int) returns int
    as
    begin
    -- 写自己的逻辑
    set @test+=1
    return @test
    end
go

-- 调用
declare @testValue int
set @testValue=1
select dbo.constData(@testValue) as 返回值
  • 效果
    【新星计划回顾】第四篇学习计划-自定义函数、存储过程、随机值知识点_第3张图片

2.2.2、表值函数

  • 方式一代码
-- 定义
create function funcName (@a int) returns table
as
return select top 10 studentName from student_score_20wan

-- 调用
select * from funcName(1)
  • 方式二代码
-- 定义
go
create function constTable (@test int) returns @tempTable table
(studentName nvarchar(50))
as
begin
    -- 写自己的逻辑
    insert into @tempTable(studentName)
    select top 10 studentName from student_score_30wan
    return
end
go

-- 调用
select * from constTable(1)
  • 方式二返回的效果
    【新星计划回顾】第四篇学习计划-自定义函数、存储过程、随机值知识点_第4张图片
  • 温馨提示
    详细可查看官方解释:https://learn.microsoft.com/zh-cn/sql/relational-databases/user-defined-functions/user-defined-functions?view=sql-server-ver16

2.2.3、修改函数

1)可视化界面修改
【新星计划回顾】第四篇学习计划-自定义函数、存储过程、随机值知识点_第5张图片
2)sql语句进行修改
通过上一步可视化界面点击修改后,同样也是跳转到sql语句界面,在界面可以查看修改使用了alter关键词
【新星计划回顾】第四篇学习计划-自定义函数、存储过程、随机值知识点_第6张图片

2.3、存储过程

关键词:proc
简单理解,存储过程的主要作用就是更加灵活集中处理各类简单或复杂场景功能,可以有入参和出参,以及获得结果集合。
存储过程优点
1)运行速度快,创建时已经编译,更加安全高效
2)可以编写更加复杂的数据库操作
3)更加能够节省网络流量,一般复杂sql语句肯定会写很多,如果每次都是通过网络传送,那必定消耗很大流量

2.3.1、创建无参数存储过程

可以先判断是否存在,不存在则创建,否则移除再创建或者其他操作
1)格式
create proc 名称
2)代码

-- 创建无参存储过程
if (exists (select * from sys.objects where name = 'proc_myProcOne'))
    drop proc proc_myProcOne
go
create proc proc_myProcOne
as
select top 10 * from student_score

-- 执行存储过程
exec proc_myProcOne;

3)效果
【新星计划回顾】第四篇学习计划-自定义函数、存储过程、随机值知识点_第7张图片

2.3.2、创建有参数存储过程

1)格式
create proc 名称(参数1,参数2,…)
2)代码

-- 创建多个参存储过程
if (exists (select * from sys.objects where name = 'proc_more_myProcOne'))
    drop proc proc_more_myProcOne
go
create proc proc_more_myProcOne(
    @studentName nvarchar(50),
    @courseName nvarchar(50)
)
as
select top 10 * from student_score 
where studentName=@studentName and courseName=@courseName

-- 执行存储过程
exec proc_more_myProcOne '陈珊歆','语文';

3)效果
【新星计划回顾】第四篇学习计划-自定义函数、存储过程、随机值知识点_第8张图片

2.3.3、修改存储过程

通过可以通过可视化界面修改,跳转到sql语句
【新星计划回顾】第四篇学习计划-自定义函数、存储过程、随机值知识点_第9张图片

原则:Write Less Do More!
简介:一只喜欢全栈方向的程序员,专注基础和实战分享,欢迎咨询,尽绵薄之力答疑解惑!

3、模拟域名数据

3.1、创建表

创建一张表用于保存域名数据

create table DomainData
(
    id int identity(1,1) primary key,
    guidData varchar(32),
    domainValue nvarchar(100),    -- 域名值,指中间部分
    domainLength int,            -- 域名长度,指中间部分
    domainType varchar(50),        -- 域名分类:cn、com
    addTime datetime
)

3.2、创建函数取值范围

创建一个表值函数,返回az和09的结果集

  • 代码如下
-- 定义函数:返回表变量结果集

go
    create function getTableRangeValue() returns @returnTable table
    (id int,value nvarchar(1))
    as
    begin
        -- 写自己的逻辑
        -- 定义表变量
        declare @tempTable table(
            id int identity(1,1) primary key, 
            value nvarchar(1)
        )
        
        insert into @tempTable values
        ('a'),('b'),('0'),('c'),('d'),('1'),('e'),('f'),('2'),('g'),('h'),('3'),('i'),('j'),('4'),
        ('k'),('l'),('5'),('m'),('n'),('6'),('o'),('p'),('7'),('q'),('r'),('8'),('s'),('t'),('9'),
        ('u'),('v'),('w'),('x'),('y'),('z')
        
        insert into @returnTable(id,value)
        select id,value from @tempTable
        return
    end
go
  • 调用函数效果如下
-- 调用代码
select * from getTableRangeValue()
  • 效果
    【新星计划回顾】第四篇学习计划-自定义函数、存储过程、随机值知识点_第10张图片
  • 温馨提示
    提示对象名无效,可不用管,直接可调用,如果不想提示下划线,可以先关掉sql工具再打开
    在这里插入图片描述

3.3、随机获取数据

通过随机排序获取第一条记录

  • 代码如下
declare @tempValue nvarchar(100)
select top 1 @tempValue=value from getTableRangeValue() order by newid()
print(@tempValue)
  • 效果如下
    【新星计划回顾】第四篇学习计划-自定义函数、存储过程、随机值知识点_第11张图片

3.4、随机长度和值

先随机生产域名长度,根据长度遍历上一步随机获取到的字符,最后拼接输出域名中间部分的值

  • 代码如下
declare @tempValue varchar(1)
declare @domainLengh int
declare @domainValue nvarchar(100)
set @domainValue=''    -- 必须先赋值,否则后面拼接值无效
-- 随机长度,2~12位
set @domainLengh=1+round(rand()*12,0)
while @domainLengh>0 begin
    set @domainLengh-=1
    select top 1 @tempValue=value from getTableRangeValue() order by newid()
    set @domainValue+=@tempValue
end
print('域名中间部分:'+@domainValue)
  • 效果如下
    【新星计划回顾】第四篇学习计划-自定义函数、存储过程、随机值知识点_第12张图片

3.5、创建函数域名中间值

通过定义标量值函数,返回域名中间值
1)域名取值范围,az,09
2)域名长度:2~12位

  • 常见情况

由于rand()这个函数无法在自定义函数内使用,
所以需要在函数内需要对这两个方式实现进行重新调整。
如果不是封装在函数和存储过程里,那么上面个函数是可以使用的
【新星计划回顾】第四篇学习计划-自定义函数、存储过程、随机值知识点_第13张图片
3)随机函数rand()替换(不推荐使用,存储高并发相同值)
通过毫秒时间取值技巧来实现随机效果

select convert(int,Datepart(ms,getdate())/(1000/(12-2+1))+2)

【新星计划回顾】第四篇学习计划-自定义函数、存储过程、随机值知识点_第14张图片
4)通过视图代替(推荐)
通过创建视图的方式获取到随机值,再通过随机值获取随机长度和随机编号。
从而代替rand()和newid()函数

go
create view randValueView
as
    select rand() randValue
go

【新星计划回顾】第四篇学习计划-自定义函数、存储过程、随机值知识点_第15张图片

5)改造后代码


go
    create function getDomainValue(@len int) returns varchar(12)
    as
    begin
        declare @domainLengh int
        declare @tempValue varchar(1)
        declare @randValue decimal(18,10)
        declare @randId int
        declare @domainValue nvarchar(100)
        set @domainValue=''
        
        -- 随机域名中间值位数
        if @len<>null begin
            set @domainLengh=@len
        end
        else begin
            -- 随机长度,2~12位
            select @randValue=randValue from randValueView
            set @domainLengh=2+round(@randValue*10,0)
        end
        
        -- 随机生产域名中间值
        while @domainLengh>0 begin
            set @domainLengh-=1
            -- 随机产生编号值(1~36)
            select @randValue=randValue from randValueView
            set @randId=1+round(@randValue*35,0)
            select top 1 @tempValue=value from getTableRangeValue() where id=@randId
            set @domainValue+=convert(varchar(1),@tempValue)
        end
        
        return @domainValue
    end
go

  • 效果
select dbo.getDomainValue(0) as 域名中间值

【新星计划回顾】第四篇学习计划-自定义函数、存储过程、随机值知识点_第16张图片

3.6、创建存储过程

通过创建存储过程来添加域名数据,上面步骤已经可以通过函数来获取到域名中间值,
接下来就是对域名表进行记录添加,以及开启作业定时执行添加操作

  • 代码如下
go
create proc proc_addDomain
as
begin
    declare @domainLength int
    declare @domainValue nvarchar(50)
    declare @tempValue nvarchar(50)
    select @tempValue=dbo.getDomainValue(0)
    set @domainLength=len(@tempValue)
    select @domainValue='www.'+ @tempValue+'.com'
    
    -- 添加一条记录
    insert into DomainData(guidData,domainValue,domainLength,domainType,addTime)
    values(newid(),@domainValue,@domainLength,'com',getdate())
end
  • 效果如下
exec proc_addDomain        -- 执行一次存储过程
select * from DomainData    -- 查询记录

【新星计划回顾】第四篇学习计划-自定义函数、存储过程、随机值知识点_第17张图片

  • 温馨提示
    打开域名链接时请注意哈,有可能是被进行的站点,不过一般会被屏蔽

本篇到此结束,感谢阅读的小伙伴,打个小小的ad,欢迎关注导师的公众号【有趣小馆】,导师会时不时发布一些有趣好玩的功能,欢迎关注!

你可能感兴趣的:(sql,server,学习)