ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

sqlserver的存储过程、触发器、函数

2021-12-25 11:04:07  阅读:167  来源: 互联网

标签:触发器 set -- sqlserver 存储 sex GO select


学习sqlserver的存储过程、触发器、函数

数据库存储结构学习

T-sql的一些语法

declare @arg char(8)   			声明 变量(变量以@开头) 类型
set @arg='123'        			给变量赋值
set @arg=(select ID from user)	给变量赋值

sqlserver的insert、update、delete注意事项

insert:插入一条数据时,会生成一个临时表inserted
update:更新一条数据时,没有临时表updated,有临时表inserted
delete:删除一条数据时,会生成一个临时表deleted

select中的条件语句示例:当性别用1,0表示时,查询结果中的性别使用【男】【女】显示

select 
case 
	when sex=1 then '男' 
	when sex=0 then '女' 
end, 
max(age),avg(age) 
from emp 
group by sex 
having sex=0

简单总结【存储结构】【触发器】【函数】的作用

1、存储结构:在数据库中定义好方法(由sql语句构成),在需要的地方直接 exec 调用。优点:sql语句复用,自定义查询方法逻辑
2、触发器:当执行【增删查改】时自动触发的sql语句
3、函数:执行一些自定义小功能,例如judge(age)函数,返回字符串【青年】还是【老年】,类似max、avg函数

存储过程

存储过程在【数据库】下的【可编程性】【存储过程】创建

作用:在数据库层面创建方法,执行SQL语句,实现自定义高级查询功能。例如:只写一条语句,当有参数【学生姓名】时,查单条;当没有参数【学生姓名】时,查所有。

调用:exec 【存储过程】【参数】

存储结构基础语法

-- 目的:调用存储结构,输入【姓名参数】查找学生的【ID,学生姓名,年龄】信息并返回
use library
drop PROCEDURE queryAll2
GO
CREATE PROCEDURE queryAll2 @name char(8)=NULL-- 添加方法参数并设默认值
	-- 添加全局参数
AS
BEGIN
	SET NOCOUNT ON;
	if @name is not NULL
    -- Insert statements for procedure here
		SELECT ID,学生姓名,年龄 from 学生表 where 学生姓名=@name
	else
		SELECT ID,学生姓名,年龄 from 学生表
END
GO
-- 调用存储结构
exec queryAll2 -- 或者
EXEC queryAll2'ls'

带输入输出参数的存储结构

-- 目的:调用存储结构,只传入一个【性别】参数,输出性别为【男】或【女】学生的【平均年龄】和【最大年龄】
use library
GO                      -- GO的作用:隔离sql语句,表示事务可以提交
drop PROCEDURE queryAll3
GO
CREATE PROCEDURE queryAll3
	@sex char(8),        -- 添加方法参数
	@AVGage float OUTPUT,
	@MAXage float OUTPUT
AS
BEGIN
	select @AVGage=AVG(年龄) from 学生表 where 性别=@sex
	select @MAXage=MAX(年龄) from 学生表 where 性别=@sex
END
GO
-- 执行使用存储结构
declare @sex char(8),@out_AVGage float,@out_MAXage float -- 连续声明三个变量
set @sex='男'                                            -- 给输入参数赋值
exec queryAll3 @sex,@out_AVGage output,@out_MAXage output -- 执行输入输出方法,有output
select @sex as 性别,@out_AVGage as 平均年龄,@out_MAXage as 最大年龄

目的:判断表、存储结构、触发器是否存在,如果存在则删除

GO
if exists(select * from sysObjects where name='queryAll3')
begin
    drop PROCEDURE queryAll3
    select'已删除'
end
GO

SQL日期运算

dateadd  在向指定日期加上天数,返回新的 datetime 值
select dateadd(day,2,'2004-10-15') 				 --返回:2004-10-17 00:00:00.000
datediff  返回两个日期天数差值
select datediff(day,'2004-09-01','2004-09-18')   --返回:17

触发器

触发器在表下面【触发器】创建

作用:当执行insert、update、delete操作时,触发事件执行额外操作,例如插入一条数据时,同时生成一条插入历史记录

调用:自动触发

执行时间和方式
例如:AFTER insert     在插入数据后执行
instead of delete     替代delete语句,执行delete操作时进入该事件

 

-- 目的:当有人借书添加记录时,判断书是否存在,并自动记录借书时间和还书时间
SET ANSI_NULLS ON -- select * from table where arg!=NULL查不出结果
GO
-- sql关键字允许通过加‘’的形式做变量
-- select 'name' 与 select name 的结果相同,off时,select 'name'显示不出数据
SET QUOTED_IDENTIFIER ON
GO
if exists(select * from sysObjects where name='borrowbook')
drop TRIGGER borrowbook
Go
CREATE TRIGGER addstudent
   ON borrow 
   AFTER insert
AS 
BEGIN
	SET NOCOUNT ON; -- 开启返回影响条数

	declare @BID int,@bookID int,@borrowDate date,@returnDate date
	set @BID=(select ID from inserted)
	set @bookID=(select bookID from inserted)
	set @borrowDate=GETDATE()
	set @returnDate=dateadd(day,90,@borrowDate)

	if exists(select * from book where ID=@bookID)
		begin
			update borrow set returnDate=@returnDate where ID=@BID
		end
	else
		begin
			rollback
			print('图书不存在')
		end

END
GO
-- 调用
insert into borrow(bookID,name) values(9,'zs') -- 插入借书数据,参数【书名】、【借书人】

用户自定义函数

作用:自定义类似sum、Max、avg、dateadd的函数

创建:通过【数据库】【可编程性】【函数】【标量值函数】创建

-- 基础模板
CREATE FUNCTION 函数名	           --创建标量函数
[({@形参名 数据类型}[,...n])] 		--括号内输入参数
RETURNS 数据类型	   --定义返回标量值的数据类型
[WITH 选项]
AS 
BEGIN
   T-SQL语句				--函数体
RETURN 标量表达式	
--返回RETURNS子句中定义的数据类型的单个数据值
END

示例(知识:1、不区分大小写2、begin end相当于{}隔离语句3、Go开启事务4、如何删除【函数】)

-- 目的:调用judge(age)函数,返回字符串'少年''青年''中年''老年'
if exists(select * from sys.objects where name = 'judge')
	drop FUNCTION dbo.judge          -- 删除定义的函数
use library
Go
-- 基础模板
create FUNCTION dbo.judge(@age int)  --创建标量函数
RETURNS nvarchar(50)	             --定义返回标量值的数据类型
AS 
BEGIN
	declare @result nvarchar(50)
	if @age > 17
		set @result='青年'
	else if @age > 30
		set @result='中年'
	else if @age > 60
		set @result='老年'
	else
		set @result='少年'
	RETURN @result	
END
GO
-- 使用函数
select name,age,sex,dbo.judge(age) from emp

 

标签:触发器,set,--,sqlserver,存储,sex,GO,select
来源: https://www.cnblogs.com/youisme/p/15729996.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有