源栈培训:数据库:函数和存储过程

更多
2019年03月28日 22点33分 作者:叶飞 修改

重新认识SQL

SQL是一种结构化(Structured)的语言(Language),所以它也必然具有以下要素:


变量:声明和赋值

--DECLARE @name NVARCHAR(20) = N'feige'
DECLARE @name NVARCHAR(20) --,@age INT  
SET @name = N'feige'
PRINT @name
必须以@开头,作用域位于一个批处理语句中。

使用@@开头的,被称之为“全局”变量。用户不能定义全局变量,全局变量只能由SQL SERVER定义。

假设我就是要DECLARE @@name NVARCHAR(20)呢? (源栈金句:能不能” 和“为什么”)

数据类型和运算符(复习)

流程控制

IF...ELSE:猜一猜这段代码的结果:

DECLARE @age INT
IF @age>18 PRINT 'Adult'
IF @age>12 PRINT 'Teenager

BEGIN...END:

WHILE:


函数

聚合函数(复习)

数值函数:

  • 四舍五入:ROUND(value, n) ;
  • 取整:FLOOR(value) / CEILING(value);
  • 随机:RAND()

字符串函数:

  • 大小写:LOWER(value) / UPPER(value);
  • 取长度:LEN()
  • 截取:LEFT(string, n) / RIGHT(string, n) / SUBSTRING(string, start, length)
  • 修建:LTRIM(string) / RTRIM(string)
  • 查找:CHARINDEX(target, string, n) 在string中从第n位字符开始查找target,找到返回target在string中的起始位置,找不到返回0
  • 替换:REPLACE(string, target, substitute) 在string找到target,用substitute替换它
  • 重复:REPLICATE(string, n)
  • 空格填充:SPACE(n)

日期函数:

  • 当前时间:GETDATE()和CURRENT_TIMESTAMP
  • 年月日:YEAR()/MONTH()/DAY()
  • 增加:DATEADD(datetype,number,date):datetype:YEAR/MONTH/WEEK/DAY……
  • 比较:DATEDIFF(datetype, start, end)
  • DATEPART(datepart,date):

数据类型转换:

  • CAST(express AS datatype)
  • CONVERT(datatype, express)

与NULL相关:

NULLIF(express1, express2):如果express1等于express2,则返回NULL值;否则返回express1


自定义函数(User Defined Function

最大特点:

必须有一个返回值


作业

  1. 打印如下所示的等腰三角形: 

          1

        333

      55555

    7777777

  2. TProblem中:
    • 找出所有周末发布的求助(添加CreateTime列,如果还没有的话
    • 找出每个作者所有求助悬赏的平均值,精确到小数点后两位
    • 有一些标题以test、[test]后者Test-开头的求助,找打他们并把这些前缀都换成大写
  3. 定义一个函数RANDINT(INT max),可以取0-max之间的最大值

定义

存储过程(Procedure) 是:

  • 一组为了完成特定功能的 SQL 语句集合(可以包含:逻辑控制语句和数据操纵语句,可以接受参数、输出参数、返回单个或多个结果集以及返回值)
  • 编译后存储在数据库中
  • 用户通过指定存储过程的名称并给出参数来执行

优点:更快的执行/更少的流量负担

缺点:可读性差/难以调试/难以维护

目前的趋势是尽量使用存储过程。


系统存储过程

sp_rename 'table_name.old_column_name', 'new_column_name', 'COLUMN';

特点:以sp_开头。所以,建议用户自定义的存储过程不要以"sp_"开头,而是使用其他字符标识(比如usp_开头)

常用系统存储过程:

  • sp_rename:
  • sp_help*: db/index/constraint/text


创建和修改

CREATE PROCEDURE usp_procedure_name 
@parameter1 type[= default][, @parameter2 type [OUTPUT]...]  
AS 

有参/无参:参数使用@开头,不能使用@@(系统内置),不能有空格

  • 输入参数
  • 输出参数:后缀OUTPUT

默认参数值:??需要??显式的指定使用默认值,如 EXEC PROC usp_some_procedure DEFAULT

修改:CREATE => ALTER


调用

如果指定参数名,不限定顺序;否则应依次赋值

EXEC[UTE] usp_procedure_name 12, 'Y'
EXEC[UTE] usp_procedure_name @Name='Y', @Age=12
具有输出参数
DECLARE @parameter type -- 声明一个变量
EXEC[UTE] usp_procedure_name @Name='Y', @Age=12, @parameter OUTPUT  -- 仍然要标明该参数为OUTPUT
SELECT @parameter

与函数的区别

  • 函数:内部(SQL语句/存储过程/其他函数)调用,不能改变数据库
  • 存储过程:把一段SQL语句合并起来,放在一个事务中,供外部调用,可以改变数据库

参考:Function vs. Stored Procedure in SQL Server


作业

编写存储过程“一起帮用户注册”,包含以下逻辑:

  1. 检查用户名是否重复。如果重复,返回错误代码:1

  2. 检查用户名密码是否符合“长度不小于4位”的要求。如果不符合,返回错误代码:2

  3. 如果有邀请人:

    • 检查邀请人是否存在,如果不存在,返回错误代码:10
    • 检查邀请码是否正确,如果邀请码不正确,返回错误代码:11
  4. 将用户名、密码和邀请人存入数据库(TRegister)
  5. 给邀请人增加10个帮帮点积分
  6. 通知邀请人(TMessage中生成一条数据)某人使用了他作为邀请人。





源栈 数据库 SQL 函数 存储过程
赞: 0 踩: 0

打赏
已收到打赏的 帮帮币

你的 打赏 非常重要!
为了保证文章的质量,每一篇文章的发布,都已经消耗了作者 1 枚 帮帮币
没有“帮帮币”,作者无法发布新的文章。

全系列阅读
评论 / 0
叶飞的系列文章

源栈培训:ASP.NET全栈开发

飞哥的源栈培训:线上全程直播,免费收看;线下拎包入住,按周计费。本系列收录所有讲义(含视频录播地址)

编程那些事:菜鸟入门

大飞哥倾力之作,面向有意入行IT/开发/编程的初学者,欢迎任何形式的留言建议……

从包工头到程序猿

真实故事,讲述我在家装公司关门之后,如何转行成为一个程序猿的故事。(《折腾》第三卷)

《折腾》(卷一)青涩

时间段:从大学毕业到开始创业。离开青葱校园,涉世之初的那些往事……

《折腾》(卷二)风雨 之(1)工地

我一个完全的门外汉(无论装修还是管理),开始给黎叔装修房子。从踌躅满志,到四处碰壁;从一往直前,到左右为难……

《折腾》(卷二)风雨 之(2)胸怀

作为一个律师,接工程没签合同,被狠狠的坑了一把!年轻人暴烈的想要复仇,黎叔教他一个企业家的胸怀……

《折腾》(卷二)风雨 之(3)渠道

成立了公司,招聘了员工,开始大力的拓展业务,一个接一个的坑,摔倒了又爬起来……

《折腾》(卷二)风雨 之(4)视野

经历残酷现实的磨砺,终于明白:干啥事,都不能闭门造车,人要走出去,开阔视野……

未分类

系统自动生成的未分类系列

一锅大杂烩

从律师到包工头,从码农到写手,读书交友生活创业,各种零零碎碎,乱七八糟……

人人都是程序猿

计算机编程普及课程,视频:https://space.bilibili.com/55410301/#/channel/detail?cid=49491

全部
关键字



帮助

反馈