09-19:存储过程

2018-09-19  本文已影响0人  神坛下的我

触发器笔记(续)

  1. 后触发器 for,DDL触发器是建立在表上的,所有语法on table for insert,
    delete,update操作会相应激活触发器,同一个触发器针对多种动作都会触发,
    通过查询inserted和deleted幻表中是否存在数据来判断是哪种操作。
    针对dml操作产生数据变化,额外做记录,使用后触发器
  2. 替代触发器(前触发器)instead of
    将dml替代掉,针对dml操作产生数据变化,需要判断和验证通过才执行的使用
    替代触发器。
create trigger trg_teacher_add
on teacher 
instead of insert 
as 
begin 
    declare @countno int 
    select @countno = count(*) from student 
    print convert(char(2),@countno)+'位教师'
    if @countno <= 11 
    begin
     insert into teacher select * from inserted
    end
    else
    begin
     print '无法添加新教师,已经满员'
    end
end
... 

  1. 星期三不准删除表
create trigger trg_drop_table
on datebase 
for drop_table
as
begin
 declare @day int
 select @day = datepart(dw,getdate())
 if(@day = 4) 
 begin
  raiserror('星期三不准删除表',16,20)
  rollback transaction
 end
end

存储过程

  1. 提高查询效率
  2. 减少网络传输
  3. 可以灵活的返回多种数据
create table train
(
 tid char(6) primary key,
 startCity varchar(20), 
 endCity varchar(20),
 begintime datetime,
 siteno  int,
 rowno int,
 coachno int
)

create table  ticket
(
 tkno char(12) primary key,
 issell int
)

create procedure prc_addTrain @tid char(6),
                  @startCity varchar(20), 
                  @endCity varchar(20),
                  @begintime datetime,
                  @siteno  int, --每排的座位数
                  @rowno int, --每节车厢的排数
                  @coachno int, --车厢
                  @outno int output
as
begin
 insert into train values(@tid,@startCity,@endCity,@begintime,@siteno,@rowno,@coachno)
 declare @i int = 0,@j int = 0,@k int = 0,@coachnot char(2),
    @rownot char(2)
 while (@i < @coachno) --循环车厢
  begin
   set @i = @i + 1
   while(@j < @rowno) --循环每节车厢的行
    begin
     set @j = @j+1
     while(@k < @siteno) -- 循环每一行的座位
      begin
       set @k = @k+1
    if(@i < 10)
    begin
     set @coachnot = '0' + convert(char(2),@i)
    end
    else
    begin
     set @coachnot = convert(char(2),@i)
    end

    if(@j < 10)
    begin
     set @rownot = '0' + convert(char(2),@j)
    end
    else
    begin
     set @rownot = convert(char(2),@j)
    end

        -- print @coachnot+@rownot+
        -- convert(char(1),char(@k + 64))
    insert into ticket values(@tid+'-'+@coachnot+@rownot+
        convert(char(1),char(@k + 64)),0)
      end
      set @k = 0
    end
      set @j = 0

  end
  set @outno = @siteno * @rowno * @coachno
end

-- 输出参数使用:存储过程定义的时候,在输入参数之后,写输出参数
带out关键值,并在存储过程中给out参数赋值,调用的时候声明相应变量
来接收输出参数。
declare @outno int
exec prc_addTrain 'T05031','成都','广安','2011-12-23',5,10,2,@outno  output
print '本次增加车票数量为'+convert(varchar(10),@outno)

-- 得到字符的ASCII值:select ASCII('a')
上一篇下一篇

猜你喜欢

热点阅读