T-SQL语句创建存储过程和触发器练习

源网页http://wenku.baidu.com/link?url=KsdJJz1oFTEwg-wwfYZESHbmCLl0e7cSUtScV3e6wv7py1XxhZK8-ZZ-YXLDdEf6TvkWCiXIVZlDIPZayaHnK8n7c552drzXZ5p_-Fq_ACq

实验过程: 
一、在student数据库上练习创建并调用课堂讲授的存储过程和触发器。 
1.创建一个instead of触发器,要求实现一下功能:在t_student表上创建一个删除类型的触发器notallowdelete,当上除记录时,显示不允许删除的提示信息 use students go 
if exists(select name from sysobjects 
          where name=‘notallowdelete‘ and type=‘tr‘)    drop trigger notallowdelete go 
CREATE trigger notallowdelete

if(@@error<>0)---------- @@代表系统变量 set @[email protected]@error return @errorvalue end

执行该存储过程: 
declare @nl as int, @num as char(10), @returnvalue as int set @num=‘S99002‘ 
exec stu_age @num,@nl output 
print ‘学号为‘+rtrim(cast(@num as char(10)))+‘的学生的年龄是‘+cast(@nl as 
char(2))+‘岁‘ 执行结果: 
 
3.创建一个名为stu_info的存储过程,要求:输入学号,查询学生所在的班级、学
生姓名,课程名和选课成绩。 
CREATE proc stu_info  @xh as char(10) as begin 
select substring(s_number,4,1) as ‘班级‘,s_name as ‘姓名‘,c_name as ‘课程名‘,score as ‘
成绩‘ 
from t_student inner join t_score 
on s_number=s_num inner join course on c_number=c_num where @xh=s_number end GO 
执行该存储过程: exec stu_info‘S99001‘ 
 
4.求一个数的阶乘(没有返回值) CREATE proc jiecheng @i as int as  
declare @result as int declare @ii as int set @result=1 set @[email protected] while @i>1 begin 
set @[email protected]*@i

set @[email protected]  if @i>1 continue else  begin  print @ii 
 print rtrim(cast(@ii as char(2)))+‘的阶乘为:‘------该输出必须使用转换数据类型
的函数cast,否则就会出现如下错误: 
 print @result   end end GO 
执行该存储过程: declare @data as int set @data=5 
exec jiecheng @data 执行结果: 5 
5的阶乘为: 120 
5.求一个数的阶乘,一个输入,一个输出。(带有输出参数的) CREATE proc jiecheng 
 @i as int,@result as int output as  
declare @ii as int set @result=1 set @[email protected] while @i>0 begin 
set @[email protected]*@i set @[email protected] if @i>1  continue else break end GO 
执行该存储过程: 
declare @data as int,@sum as int set @data=5 
exec jiecheng @data,@sum output 
print rtrim(cast(@data as char(2)))+‘的阶乘为:‘ print @sum

执行结果为: 5的阶乘为: 120 
(6)带有默认值的存储过程。 
输入学号,查询学生所在的班级、学生姓名,课程名和选课成绩。(stu_info1) CREATE proc stu_info1 @num as char(10)=‘S99001‘ as 
select substring(s_number,4,1) as ‘班级‘,        s_name as ‘姓名‘,        c_name as ‘课程名‘,        score as ‘成绩‘ 
from t_student inner join t_score 
on s_number=s_num inner join course on c_number=c_num where @num=s_number GO 
执行存储过程: exec stu_info1 执行结果: 
 
当不输入指定的学号时,数据库自动给@num赋值为:S99001   
三、在BBS数据库上设计所需触发器 
? 发表主帖,用户积分加10分,版块发帖量加1。 
CREATE trigger publish  on BBSTopic for insert as 
begin 
declare @yhID as int 
declare @bkID as int 
select @yhID=TUID , @bkID=TSID from inserted update BBSUser  set UPoint=UPoint+10 where @yhID=UID update BBSSession 
set STopicCount=STopicCount+1

where @bkID=SID end  
执行插入语句后: 
Insert 
IntoBBSTopic(TID,TSID,TUID,TTopic,TContents,TClickCount,TFlag,TLastClickT,TReplyCount) 
values(‘6‘,‘2‘,‘1‘,‘买卖商场 ‘) 
执行该操作后,BBSUser表中的UID=1的用户‘火云邪神’的积分UPoint加10;BBSSseeion表中的SClickCount加1。           
跟帖,用户积分加1,主帖的回复数量加1、更新最后回复
时间,版块发帖量加1。  
create trigger gt on BBSReply 
for insert,update as begin 
declare @yhID as int,@ztID as int,@bkID as int 
select @yhID=RUID,@ztID=RTID,@bkID=RSID from inserted update BBSUser set UPoint=UPoint+1 where @yhID=UID update BBSTopic 
set TReplyCount=TReplyCount+1 where @ztID=TID 
update BBSSession 
set STopicCount=STopicCount+1 where @bkID=SID end 
执行插入语句: insert into 
BBSReply(RID,RTID,RSID,RUID,RTopic,RContents) values(‘6‘,‘2‘,‘1‘,‘2‘,‘就业难‘,‘机会不平等‘) 
在BBSUser表中2号用户的UPoint就会加1;在BBSTopic表中2号主帖的回复量(TReplyCount)就会变为7;在BBSSession表中版块发帖量(STopicCount)就会变为1601.

? 删除跟帖,用户积分减20分,版块发帖量减1。 
create trigger scgt on BBSReply for delete,update as begin 
declare @yhID as int,@bkID as int 
select @yhID=RUID ,@bkID=RSID from deleted update BBSUser set UPoint=UPoint-20 where @yhID=UID 
update BBSSession 
set STopicCount=STopicCount-1 where @bkID=SID end 
删除主帖,用户积分减50分,版块发帖量减1,删除所有跟帖。  
create  trigger sczt on BBSTopic for delete,update as begin 
declare @yhID as int declare @bkID as int 
declare @gtID as int 
select @yhID=TUID,@bkID=TSID from deleted update BBSUser set UPoint=UPoint-50 where @yhID=UID 
update BBSSession 
set STopicCount=STopicCount-1 delete 
from BBSReply 
where RTID=(select TID from deleted )

时间: 2024-10-11 04:05:38

T-SQL语句创建存储过程和触发器练习的相关文章

sql sever的sql语句有关存储过程与触发器

创建一个InsertS的存储过程,向S中插入一条记录,新记录的值由参数提供.如果未提供所在城市的值,由参数的默认值‘济南’代替.并验证该存储过程的执行情况. create procedure InsertS @Sno varchar(10), @sname varchar(20), @statu int, @City varchar(20)='济南' as insert into s values (@Sno,@sname,@statu,@City) Go declare @Sno varcha

SQL Server创建存储过程(转载)

什么是存储过程? q       存储过程(procedure)类似于C语言中的函数 q       用来执行管理任务或应用复杂的业务规则 q       存储过程可以带参数,也可以返回结果 q       存储过程可以包含数据操纵语句.变量.逻辑 控制语句等 存储过程的优点 (1)执行速度快. 存储过程创建是就已经通过语法检查和性能优化,在执行时无需每次编译. 存储在数据库服务器,性能高. (2)允许模块化设计. 只需创建存储过程一次并将其存储在数据库中,以后即可在程序中调用该过程任意次.存储

利用navicat创建存储过程、触发器和使用游标的简单实例

创建存储过程和触发器 1.建表 首先先建两张表(users表和number表),具体设计如下图: 2.存储过程 写一个存储过程,往users表中插入数据,创建过程如下: 代码如下: BEGIN     #Routine body goes here...     declare n bigint;     set n = 201121029684;     while n <= 201121029694     do         insert into users(student_ID) v

【转】用sql语句创建表的时候给列指定说明(描述)

用sql语句创建表的时候,如何给列指定说明.主要用到sp_addextendedproperty这个存储过程. 语法   sp_addextendedproperty     [ @name = ] { 'property_name' }     [ , [ @value = ] { 'value' }         [ , [ @level0type = ] { 'level0_object_type' }                     , [ @level0name = ] {

5-04用Sql语句创建表

用Sql语句创建表的基本语法: USE E_Market--指向当前所操作的数据库 GO CREATE TABLE CommoditySort--创建表的名字 { sortID int IDENTITY(1,1) NOT NULL,类别编号 sordName varchar(50) NOT NULL --类别名称 } GO

使用SQL语句创建和删除约束

约束的目的就是确保表中的数据的完整性. 常用的约束类型如下: 主键约束:(Primary Key constraint)      要求主键列唯一,并且不允许为空 唯一约束:(Unique Constraint)              要求该列唯一,允许为空,但只能出现一个空值 检查约束:(Check Constraint)                某列取值范围限制.格式限制等.如有关年龄的限制 默认约束:(Default Constraint)               某列的默认

EF中使用SQL语句或存储过程

EF中使用SQL语句或存储过程或视图 1.无参数查询var model = db.Database.SqlQuery<UserInfo>("select* from UserInfoes ").ToList(); 2.有参查询var model = db.Database.SqlQuery<UserInfo>("select* from UserInfoes where [email protected] ",new SqlParameter

使用sql语句创建修改SQL Server标识列(即自动增长列)

一.标识列的定义以及特点SQL Server中的标识列又称标识符列,习惯上又叫自增列.该种列具有以下三种特点:1.列的数据类型为不带小数的数值类型2.在进行插入(Insert)操作时,该列的值是由系统按一定规律生成,不允许空值3.列值不重复,具有标识表中每一行的作用,每个表只能有一个标识列.由于以上特点,使得标识列在数据库的设计中得到广泛的使用.二.标识列的组成创建一个标识列,通常要指定三个内容:1.类型(type)在SQL Server 2000中,标识列类型必须是数值类型,如下:decima

Access sql语句创建表及字段类型(转)

http://www.cnblogs.com/hnyei/archive/2012/02/23/2364812.html 创建一张空表: Sql="Create TABLE [表名]" 创建一张有字段的表: Sql="Create TABLE [表名]([字段名1] MEMO NOT NULL, [字段名2] MEMO, [字段名3] COUNTER NOT NULL, [字段名4] DATETIME, [字段名5] TEXT(200), [字段名6] TEXT(200))