触发器的原理是跟存储过程类似的,但是触发器是一个特殊的存储过程。他往往伴随事件执行。 触发器目前有两种: 1、DML触发器。2、DDL触发器 原理大家可以网上百度下,我这里主要写一下用法

-- 删除触发器
DROP TRIGGER 触发器名称;
-- 创建触发器 
-- 基本语句如下﹕  
create trigger 触发器名称
    on {table_name | view_name}
    {for | After | Instead of }
    [ insert, update,delete ]
       sql语句
-- 实例
-- 创建student表的触发器
CREATE TRIGGER student_trigger 
ON student 
FOR insert   -- 在插入数据的时候触发
	-- 这里跟写存储过程一样
	DECLARE @i varchar(50) --定义变量
	set @i = 1  --给变量赋值
	PRINT '插入' -- 输出

存储过程(procedure)

当你想使用一系列sql一起执行时,就可以使用存储过程

-- 删除存储过程
DROP PROCEDURE 存储过程名字;
-- 执行存储过程
exec 存储过程名字 变量1,变量2,...
-- 创建存储过程语法
CREATE PROCEDURE 名字(
@变量1名 类型
@变量2名 类型
BEGIN
	sql语句
-- 实例
CREATE PROCEDURE pro_name(
  @year char(4),
  @schId varchar(1000)
begin
	print "测试"
-- 执行
exec pro_name '2022', '5800'

游标(CURSOR)

个人理解游标其实跟循环类似,但是比循环还要耗性能。 游标是针对行操作的

读取数据开始

fetch next from stuCur --读取当前行的下一行,并使其置为当前行(刚开始时游标置于表头的前一行,即若表是从0开始的,游标最初置于-1处,所以第一次读取的是头一行)
fetch prior from stuCur --读取当前行的前一行,并使其置为当前行
fetch first from stuCur --读取游标的第一行,并使其置为当前行(不能用于只进游标)
fetch last from stuCur --读取游标的最后一行,并使其置为当前行(不能用于只进游标)
fetch absolute 2 from stuCur --读取从游标头开始向后的第2行,并将读取的行作为新的行
fetch relative 3 from stuCur --读取从当前行开始向后的第3行,并将读取的行作为新的行
fetch relative-2 from stuCur --读取当前行的上两行,并将读取的行作为新的行

@@fetch_status是MSSQL的一个全局变量

其值有以下三种,分别表示三种不同含义:【返回类型integer】

  - 0 FETCH 语句成功

  -1 FETCH 语句失败或此行不在结果集中

  -2 被提取的行不存在

--定义变量
DECLARE @i int 
SET @i = 0
--创建游标stu_cursor ,查询students表
DECLARE stu_cursor CURSOR FOR SELECT autoid FROM students 
-- 打开游标
OPEN stu_cursor
	-- 通过游标获取每行的 autoidz字段,并定义成 @autoid 变量
	FETCH NEXT FROM stu_cursor INTO @autoid
	while @@FETCH_STATUS = 0
	begin
		UPDATE students SET stuid = @i WHERE autoid=@autoid
	set @i = @i + 1
-- 关闭游标
CLOSE stu_cursor
-- 上面是通过游标,获取autoId来修改stuid学号
复制代码
  •