【SQL】触发器示例

局部变量的定义与赋值

DECLARE @C1 CHAR(20),@C2 CHAR(10),@C3 CHAR(30)
SELECT @C1='SQL Server',@C2='2008'
SET @C3=@C1+@C2
SELECT @C3

DECLARE @C1 VARCHAR(20),@C2 VARCHAR(10),@C3 VARCHAR(30)
SELECT @C1='SQL Server',@C2='2008'
SET @C3=@C1+@C2
PRINT @C3

流程控制语句

BEGIN…END语句

语法

BEGIN
   SQL语句1
   SQL语句2END

IF…ELSE语句

语法

IF 布尔表达式
   SQL语句块
[ELSE
   SQL语句块]

WHILE、BREAK和CONTINUE语句

语法

WHILE 布尔表达式
  SQL语句块
  [BREAK]
  SQL 语句块
  [CONTINUE]

系统函数

CASE函数

CASE 
  WHEN boolean_expression THEN result_expression
  […n]
  [ELSE else_result_expression]
END

SELECT 学号, 姓名, 
等级= 
CASE 
 WHEN 总学分 IS NULL THEN '尚未选课'
        WHEN 总学分 < 50 THEN '不及格'
        WHEN 总学分 >=50 and 总学分<=52 THEN '合格'
        ELSE '优秀'
END
FROM XS
WHERE 专业='计算机'

日期函数

DATENAME(Year,Date)   /*返回字符串格式*/
DATEPART(Year,Date)   /*返回数值格式*/
YEAR(Date)

SELECT DATEADD(year,1,'2004/7/16')

(3)字符串函数
(4)数学函数
注:查询联机丛书

用户自定义函数

CREATE FUNCTION fn_stuName(@stuId char(9))
RETURNS char(20)
AS
BEGIN
  DECLARE @Name char(20)
  SET @Name=
    (
     SELECT Sname
     FROM Student
     WHERE Sno=@stuId
    )
  RETURN @Name
End
go
DECLARE @Name char(20)
EXEC @Name=dbo.fn_stuName @stuID='200215121'
PRINT @Name

示例1

/***************示例1***************/
USE Stu_Course
GO
/*检查是否存在score表,若存在,则删除*/
IF EXISTS
  (SELECT * FROM sysobjects
   WHERE name ='score')
DROP TABLE score
GO
/*创建score表*/
CREATE TABLE score
(
  student_no int,
  score int
)
/*检查是否存在check_score触发器,若存在,则删除*/
IF EXISTS
  (SELECT * FROM sysobjects
   WHERE name ='check_score' AND type='TR')
DROP TRIGGER check_score
GO
/*在score表上创建check_score触发器*/
CREATE TRIGGER check_score ON score
FOR INSERT,UPDATE
AS
DECLARE @score int
SELECT @score=score FROM inserted
IF @score<0 OR @score>100
  BEGIN
    ROLLBACK
    RAISERROR('成绩必须在0到100之间!',16,1)
  END
GO
insert score VALUES(200401,120)
insert score VALUES(200401,100)

示例2

/***************示例2***************/
DROP TRIGGER check_score
GO
/*在score表上创建check_score触发器,更新并显示新老数据表*/
CREATE TRIGGER check_score ON score
FOR INSERT,UPDATE
AS
DECLARE @newscore int   /*新数据变量*/
DECLARE @oldscore int   /*老数据变量*/
SELECT * FROM inserted  /*新数据显示*/
SELECT * FROM deleted   /*老数据显示*/
SELECT @newscore=score FROM inserted  /*新数据赋值*/
SELECT @oldscore=score FROM deleted   /*老数据赋值*/
IF @newscore<0 OR @newscore>100
  BEGIN
    ROLLBACK
    RAISERROR('成绩必须在0到100之间!',16,1)
  END
GO
update score
set score=120
where student_no=200401
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cout0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值