




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验三 存储过程和触发器一、实验目的1 掌握Transact-SQL编程知识;2 学习、掌握存储过程和触发器的建立和使用二、存储过程练习1 建立简单存储过程创建一个简单的存储过程,了解实现存储过程的语法。推荐精选1)输入并执行下面语句USE NorthwindGOCREATE PROCEDURE FirstProcASSELECT TOP 5 ProductName, UnitPrice FROM Products ORDER BY UnitPrice descGO2)输入并执行如下语句:Use northwindexec firstproc推荐精选这个存储过程的含义是什么?是否可以用视图实现
2、同样的功能? 答:查询在Products中Unit price 在前5的商品名称(Product name)和价格(Unit price) 可以视图来实现同样的功能,实验结果如图1所示 图1 练习1结果截图注意: 区别视图和存储过程。 存储过程第一次执行时进行编译并驻留在高速缓存中,以后再执行时,只需从高速缓存中调用已编好的二进制代码,对于经常被执行且功能固定的查询需求,存储过程将大节省SQL server执行时间(2)存储过程可以减少网络流量(3)是一种安全机制(4)屏蔽T-SQL命令视图是一个虚拟表。视图不在数据库中以存储的数据值形式存在。行和列数据来自定义视图的查询所引用的表,并且在引用
3、视图上自动生成。练习2 进一步使用存储过程,当执行存储过程时,将执行时的信息返回给用户推荐精选1)输入并执行下面语句推荐精选create proc Error_procas declare MaxPrice moneydeclare Char varchar(20)推荐精选select Maxprice=max(unitprice) from products -找出价格最大值,并将值赋给变量set char=cast(Maxprice as varchar(20) -转换数据类型为字符型raiserror('The max price is %s',10,1,char) go
4、推荐精选2)输入并执行语句调用存储过程:exec error_proc推荐精选显示结果是什么?变量值是否传递给显示信息? 答:变量值可以传递到显示信息,实验结果为练习3 使用输出参数返回变量值通过使用Output选项返回存储过程中的数值1)输入并执行下面语句create proc Return_procReturnMaxPrice money outputas select ReturnMaxPrice=max(unitprice) from products go2)执行下面语句,调用存储过程declare return moneyexec Return_proc return output
5、select return是否显示结果?显示的内容是什么答:可以显示。结果为:注意: 在存储过程中的返回参数定义Output选项,在调用存储过程时也要定义Output选项,来接收返回值。练习4 按如下要求编写存储过程,并执行1) 在pubs数据库中创建一个存储过程,输入书的ID号(title_id),存储过程检索该书的书名、出版社名。推荐精选 use pubsgocreate proc return_infotitle_id nvarchar(6)asselect titles.title,publishers.pub_namefrom titles,publisherswhere title
6、s.pub_id=publishers.pub_id and titles.title_id=title_id go推荐精选执行存储过程:推荐精选use pubsexec return_info 'BU7832'实验结果为: 2) 创建一个存储过程,入口参数为一个时间类型的值,返回如下格式的时间字符串:xxxx年xx月xx日。(提示:使用DATEPART函数,可在联机丛书中查询使用方法) create proc datatydate datetimeasprint(str(DATEPART(yy,date)+'年'+str(DATEPART(mm,date)+&
7、#39;月'+str(DATEPART(dd,date)+'日')go执行存储过程:exec dataty '2010-12-25'实验结果为:3) 在pubs数据库中创建一个存储过程。如果作者所在的State为CA,则显示为“加州”;如果是KS,显示为“堪萨斯”;若是其它州,显示为“Others”。推荐精选use pubsgocreate proc infasselect au_id as 作者编号,au_lname as 作者名,state,所在地=case when state='CA' then '加州'when
8、state='KS' then '堪萨斯'else 'others'endfrom authors go推荐精选执行存储过程:exec inf.以下结果略去。二、触发器练习1:创建触发器要求:Products表中的UnitIsStock字段存放的是每个产品的库存量,Order Details表中存放的是订单信息。当增加一个新订单时,库存量应该自动减去订单里面的订货数量。推荐精选1) 先使用sp_helptrigger Order Details命令查看Order Details表中关于触发器信息。2) 在Order Details表上创建触发器,
9、自动计算库存量。输入并执行下面语句推荐精选USE NorthwindGOIF EXISTS ( SELECT name FROM sysobjectsWHERE type = 'TR' AND name = 'OrdDet_Insert' )DROP TRIGGER OrdDet_InsertGOCREATE TRIGGER OrdDet_InsertON Order DetailsFOR INSERTASUPDATE P SET UnitsInStock = (P.UnitsInStock - I.Quantity)FROM Products AS P INN
10、ER JOIN Inserted AS ION P.ProductID = I.ProductIDGO推荐精选3) 用sp_helptrigger Order Details命令查看Order Details表中关于触发器信息。4)使用下面的语句测试触发器。输入编号为11077的订单,并且订货数量为50,并用两个Select语句查看结果。(下面语句一起执行结果会很明显)select productid,UnitsInStock from products where productid=22insert into Order Details (orderid,productid,unitpri
11、ce,quantity,discount)values (11077,22,21.00,50,0.0)select productid ,UnitsInStock from products where productid=224) 两次库存数量的差值是什么?答:两次库存的差额是50实验结果如右图所示:注意:临时表Inserted的使用。练习2:创建删除触发器设有两张表NewCategories和NewProducts。当删除NewCategories表中一条记录时,NewProducts表中的相关数据同时删除。1)创建两张新表NewCategories和NewProducts。USE Nor
12、thwindGOSELECT * INTO NewCategories FROM CategoriesSELECT * INTO NewProducts FROM Products推荐精选GO2)输入并执行下面语句,用以在NewCategories表上创建删除触发器CREATE TRIGGER Category_Delete ON NewCategories FOR DELETEAS DELETE NewProducts FROM NewProducts AS P INNER JOIN Deleted AS d ON P.CategoryID = D.CategoryID3)使用下面的语句测试
13、触发器。在NewCategories表中删除分类号为6的记录,并用两个Select语句查看NewProducts表结果。(下面语句一起执行结果会很明显)SELECT ProductID, CategoryID, Discontinued FROM NewProducts WHERE CategoryID = 6DELETE NewCategories WHERE CategoryID = 6SELECT ProductID, CategoryID, Discontinued FROM NewProducts WHERE CategoryID = 64) NewProducts表中分类号为6的记
14、录是否自动删除?答:删除了。如右图所示 练习3:使用触发器验证业务规则newProducts表中存放每个产品的基本信息,Order Details表中存放的是订单信息。如果一个产品存在着订单,那么这个产品不能从newProducts表中被删除。1)在上面实验创建的newProducts表上创建触发器。推荐精选USE NorthwindGOCREATE TRIGGER Product_Delete ON NewProducts FOR DELETEASIF (Select Count (*) FROM Order Details INNER JOIN deleted ON Order Detai
15、ls.ProductID = Deleted.ProductID ) > 0 BEGIN RAISERROR('Transaction cannot be processed. This Product still has a history of orders.', 16, 1) ROLLBACK TRANSACTIONEND推荐精选2)使用下面语句测试触发器,将产品编号为1的产品信息从NewProducts中删除。DELETE NewProducts WHERE ProductID = 6推荐精选3) 是否能删除?为什么?不能删除,触发器验证业务规则,如运行结果所示运
16、行结果:消息50000,级别16,状态1,过程Product_Delete,第10 行Transaction cannot be processed. This Product still has a history of orders.消息3609,级别16,状态1,第1 行事务在触发器中结束。批处理已中止。练习4:约束与触发器的激活顺序Products表中存放每个产品的基本信息,Order Details表中存放的是订单信息。如果一个产品存在着订单,那么这个产品不能从Products表中被删除。1)在Products表上创建触发器。推荐精选USE NorthwindGOCREATE TRI
17、GGER Product_Delete2 ON Products FOR DELETEASIF (Select Count (*) FROM Order Details INNER JOIN deleted ON Order Details.ProductID = Deleted.ProductID ) > 0 BEGIN RAISERROR('Transaction cannot be processed. This Product still has a history of orders.', 16, 1) ROLLBACK TRANSACTIONEND推荐精选2)使用下面语句测试触发器,将产品编号为1的产品信息从Products中删除。DELETE Products WHER
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《汉语阅读教程》课件-教学课件:汉语阅读教程
- 2025标准办公室装修设计合同
- 湖南省长沙市雅礼教育集团2024-2025学年高一下学期期中考试物理试题(原卷版)
- 钝痛的临床护理
- 2025金融服务行业中介居间合同范本
- 2025汽车买卖的合同范文
- 江苏移动2025春季校园招聘笔试参考题库附带答案详解
- 2025房产交易合同样本:个人房屋买卖协议
- 2025年公共营养师之二级营养师题库综合试卷B卷附答案
- 胃出口梗阻的临床护理
- (二模)济宁市2025年4月高考模拟考试地理试卷
- 首都医科大学附属北京安贞医院招聘考试真题2024
- 抽化粪池合同协议
- 中医养生馆运营方案中医养生馆策划书
- (二模)宁波市2024-2025学年第二学期高考模拟考试 英语试卷(含答案)+听力音频+听力原文
- 高考备考:100个高考常考易错的文言实词(翻译+正误辨析)
- 软件项目交付管理制度
- 知识产权现场审核记录表模板
- 食品安全自查、从业人员健康管理、进货查验记录、食品安全事故处置等保证食品安全的规章制度
- 2024年吉林省中考满分作文《情味浸润的时光》4
- 基于PLC的自动生产线控制系统的设计毕业论文
评论
0/150
提交评论