您的位置:首页 > 其它

使用存储过程

2014-01-06 21:12 260 查看
--使用存储过程
/*存储过程
使用的大多数SQL语句都是针对一个或多个表的单条语句,
并非所有的操作都这么简单,经常会有一个完整的操作需要多条语句才能完成。例如,考虑以下情形
1、为了外理订单,需要核对以保证库存中有相应的物品;
2、如果库存有物品,这些物品需要预定以使不将它们卖给别的人,并且要减少可用物品数量以后眏正确的库存量
3、存中没有的物品需要订购,这需要与供应商进行某种交互
4、关于哪些物品入库(并且可以发货)和哪些物品退订,需要通知相应的客户。
执行这个处理需要许多表及多条T-SQL语句,需要执行的具体语句及其次序也不是固定的,这就需要创建存储过程。
就是为以后的使用而保存一条或多条T-SQL语句的集合,可将其视为批文件,虽然它的作用不仅限于批处理。
为什么要使用存储过程呢?
1、通过把处理封装在容易使用的单元中,简化复杂的操作(正如前面的例子所述)
2、由于不要求反复建立一系列的处理步骤,这保证了数据的完整性。如果所有开发人员和应用程序都使用同一(试
   验和测试)存储过程,则所用的代码都是相同的。
   这一点延伸就是防止错误,需要执行的步骤越多,出错的可能性就越大,防止错误保证了数据的一致性。
3、简化对变动的管理,如果表名、列名或业务逻辑越多(或别的内容)的变化,只需要更改存储过程和代码。使用
   它的人员甚至不需要知道这些变化。
   这一些延伸就是安全性。通过存储过程限制对基础数据的访问减少了数据错误的机会。
4、提高性能。因为存储过程比使用单独的SQL语句要快
5、存在一些只能用在单个请求中的T-SQL语言元素和SQL Server特性,存储过程可以用它们来编写功能更灵活的代码。
  显然使用存储过程有3个好处:即简单、安全、高性能。虽然他们很重要,不过在将SQL转换为存储过程前,必须知
道它的一些缺陷:
1、一般来说,存储过程有的编写比基本的SQL语句工复杂,编写存储过程需要更高的技能及丰富的经验。
2、你可能没有创建存储过程的安全访问权限。许多数据库管理员限制了存储过程的创建权限,只允许使用。*/
--使用存储过程
--执行存储过程:
EXECUTE productpricing @cheap OUTPUT,@expensive OUTPUT,@average OUTPUT
--执行名为:productpricing的存储过程,它计算并返回产品的最低、最高和平均价格。
--EXECUTE可以简写为:EXEC
--创建存储过程
--创建一个返回产品平均价格的存储过程,以下是代码:
--input
CREATE PROCEDURE productpricing as
BEGIN
SELECT avg(prod_price) as priceaverage
FROM products;
END;
--执行这个存储
EXEC productpricing;
--删除存储过程
DROP procedure productpricing
--以下是productpricing的修改版本
CREATE PROCEDURE productpricing
@price_min MONEY OUTPUT,
@price_max MONEY OUTPUT,
@price_avg MONEY OUTPUT
AS
BEGIN
  SELECT @price_min = min(prod_price)
  FROM products;
  SELECT @price_max = max(prod_price)
  FROM products;
  SELECT @price_avg = avg(prod_price)
  FROM products;
END
--使用修改后的存储过程必须指定3个变量名:如下
DECLARE @cheap MONEY
DECLARE @expensive MONEY
DECLARE @average MONEY
EXEC productpricing @cheap output,
                    @expensive output,
                    @average output
--为了获得3个值,可使用下面的语句。
select @cheap,@expensive,@average;
use studb
CREATE PROCEDURE ordertotal
@order_num int,
@order_total money output
AS
BEGIN
  SELECT @order_total=sum(item_price*quantity)
  FROM orderitems
  WHERE order_num=@order_num;
END;
--select order_num,item_price*quantity from orderitems
--@order_num用来传递一个值给存储,因此不需要OUTPUT,@order_total定义为OUTPUT,因为要从存储过程中返回合计值。
DECLARE @order_total MONEY
EXEC ordertotal 20009,@order_total OUTPUT
SELECT @order_total
DROP PROCEDURE ordertotal
--建立智能存储过程
/*考虑这个场景,你需要荼得与以前一样的订单合计,但需要对合计增加营业税 ,不过只针对某些顾客(或是你所在洲的那些
顾客),那么,你需要做几件事:
1、获得合计
2、把营业税 有条件地添加到合计
3、返回合计(带或不带税)
存储过程的完整工作如下:*/
--Name:ordertotal
--Partmeters:@order_num   = order number
--           @taxable     =0 if not taxable,1 if taxable
--           @order_total =order total variable
CREATE PROCEDURE ordertotal
  @order_num int,
  @taxable bit,
  @order_total MONEY OUTPUT
AS
BEGIN
  --DECLARE variable for total
  DECLARE @total MONEY;
  --declare tax percentage
  DECLARE @taxrate int;
  --SET tax rate (adjust as needed)
  SET @taxrate=6;
  --Get the order total
  SELECT @total=SUM(item_price*quantity)
  FROM orderitems
  WHERE order_num=@order_num
  --is this taxable?
  IF @taxable=1
    --Yes,so add taxrate to the total
    SET @total=@total+(@total/100*@taxrate);
    --and finlly, save to output variable
    SELECT @order_total=@total;
END
--测试结果
--select SUM(item_price*quantity) FroM orderitems where order_num=20005
DECLARE @order_total MONEY
EXECUTE ordertotal 20005,0,@order_total OUTPUT
SELECT @order_total
DECLARE @order_total MONEY
EXECUTE ordertotal 20005,1,@order_total OUTPUT
SELECT @order_total
--这两个EXEC调用的区别就是EXECUTE传递0或是1,如是1则含税。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  库存量 供应商