【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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章