首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

请问一个存储过程优化

2013-01-26 
请教一个存储过程优化试着学做SQL存储过程,不知这个存储过程问题在哪里,还能如何优化,特发出来向有经验的

请教一个存储过程优化
试着学做SQL存储过程,不知这个存储过程问题在哪里,还能如何优化,特发出来向有经验的朋友请教,敬请指点,谢谢!
CREATE PROCEDURE [dbo].[p_yyk_qz]

(
  @bzqbm VARCHAR(10)='桑拿',  --部门
  @yyrq VARCHAR(15),  --营业日期
  @dhhm VARCHAR(15),  --电话号码
  @jsgh VARCHAR(10),  --技师工号
  @jsmm VARCHAR(10),  --技师密码
  @ccgcfhz INT OUTPUT,  --存储过程返回值
  @ccgcfhzms NVARCHAR(100) OUTPUT  --存储过程返回值描述
  )

AS

  DECLARE @fh varchar(10)
  DECLARE @jsxm varchar(10)
  DECLARE @jsxb varchar(2)
  DECLARE @zdid varchar(20)
  DECLARE @gkid varchar(20)
  DECLARE @fwxm varchar(50)
  DECLARE @jb bit
  DECLARE @dz bit
  DECLARE @fwy varchar(10)
  DECLARE @ph varchar(10)
  DECLARE @mc varchar(10)
  DECLARE @xfsj datetime
  DECLARE @yjtzjssj datetime
  DECLARE @fl varchar(10)
  DECLARE @zl varchar(10)
  DECLARE @xmmc varchar(30)
  DECLARE @dw varchar(2)
  DECLARE @dj decimal
  DECLARE @sl decimal
  DECLARE @yxdz bit
  DECLARE @jzdz bit
  DECLARE @zdjr bit
  DECLARE @zdjs bit
  DECLARE @sc decimal
  DECLARE @tzjssl decimal
  DECLARE @djcpbm bit
  DECLARE @ksjs bit
  DECLARE @tcxm bit
  DECLARE @jsfw bit
  DECLARE @cpddy bit
  DECLARE @fjfw bit
  DECLARE @kgxm bit
  DECLARE @ck varchar(10)
  DECLARE @cpbm varchar(10)
  DECLARE @jffs varchar(10)
  DECLARE @fwyxm varchar(10)
  DECLARE @js varchar(10)
  DECLARE @dydd varchar(10)
  DECLARE @fwdd varchar(10)

  BEGIN

    --通过电话号码取房间号
    DECLARE curFj CURSOR FOR
    SELECT bh FROM g_sy_bh WHERE xm=@bzqbm AND dh=@dhhm
    OPEN curFj 
    FETCH NEXT FROM curFj 
    INTO @fh
    WHILE (@@FETCH_STATUS=0)

    --通过技师工号获取技师安排信息
    DECLARE curJs CURSOR FOR
    SELECT name,xb,gkid,fwxm,jb,dz,fwy,fwdd,zt FROM g_sy_js WHERE xm=@bzqbm AND gh=@jsgh  AND rq=@yyrq
    OPEN curJs
    FETCH NEXT FROM curJs
    INTO @jsxm,@jsxb,@gkid,@fwxm,@jb,@dz,@fwy
    WHILE (@@FETCH_STATUS=0)

    --通过安排技师的顾客ID判断宾客是否结帐,并取得宾客信息,以便写消费明细时调用
    DECLARE curBk CURSOR FOR
    SELECT bh,mc,zdid,ld FROM g_sy_xfjs WHERE xm=@bzqbm AND gkid=@gkid
    OPEN curBk
    FETCH NEXT FROM curBk
    INTO @ph,@mc,@zdid
    WHILE (@@FETCH_STATUS=0)




    --通过安排技师的服务项目获取服务项目信息
    DECLARE curFwxm CURSOR FOR
    SELECT GETDATE() AS xfsj,DATEADD(minute,sc,GETDATE()) AS yjtzjssj,fwxmfl,zl,xmmc,dw,dj,yxdz,jzdz,zdjs,sc,tzjssl,djcpbm,tcxm,jsfw,cpddy,fjfw,kgxm,ck FROM g_sy_fwxm WHERE xm=@bzqbm AND xmmc=@fwxm
    OPEN curFwxm
    FETCH NEXT FROM curFwxm
    INTO @xfsj,@yjtzjssj,@fl,@zl,@xmmc,@dw,@dj,@yxdz,@jzdz,@zdjs,@sc,@tzjssl,@djcpbm,@tcxm,@jsfw,@cpddy,@fjfw,@kgxm,@ck
    WHILE (@@FETCH_STATUS=0)

    DECLARE @xfmxid varchar(20)
    SET @xfmxid=NEWID()
    --写入消费明细
INSERT INTO g_sy_xfmx(xfmxid,zdid,gkid,xm,bh,mc,fl,zl,xmmc,dw,dj0,dj,sl,xj,dzl,dze,ys,czy,yxdz,jzdz,zdjr,zdjs,sc,tzjssl,xfrq,xfsj,yjtzjssj,ksjs,ksjssj,ksjsczy,djcpbm,cpbm,jffs,tcxm,fwy,fwyxm,jsfw,js,jsxm,jsxb,jb,dz,cpddy,dydd,fjfw,fwdd,kgxm,ck) VALUES (@xfmxid,@zdid,@gkid,@bzqbm,@ph,@mc,@fl,@zl,@xmmc,@dw,@dj,@dj,1,@dj,0,0,@dj,@jsgh,@yxdz,@jzdz,@zdjr,@zdjs,@sc,@tzjssl,@yyrq,@xfsj,@yjtzjssj,@ksjs,@xfsj,@jsgh,@djcpbm,@cpbm,@jffs,@tcxm,@fwy,@fwyxm,@jsfw,@js,@jsxm,@jsxb,@jb,@dz,@cpddy,@dydd,@fjfw,@fwdd,@kgxm,@ck)


    --更新技师上钟信息
    UPDATE g_sy_js set gkbh=@ph,gkmc=@mc,gkid=@gkid,zt='上',szsj=@xfsj,yjxzsj=@yjtzjssj WHERE xm=@bzqbm AND gh=@jsgh


    --更新服务房间状态为有客
    UPDATE g_sy_bh SET zt='有客' WHERE xm=@bzqbm AND bh=@fh AND kgfwxmdj=1 AND zt<>'有客' 


    --更新安排通知日志为已起钟
    UPDATE g_sy_js_aptzrz SET qz=1 WHERE xm=@bzqbm AND gh=@jsgh AND qz=0 AND qxtz=0

    CLOSE curFj
    DEALLOCATE  curFj
    CLOSE curJs
    DEALLOCATE  curJs
    CLOSE curBk
    DEALLOCATE  curBk 
    CLOSE curFwxm
    DEALLOCATE  curFwxm

    SET @ccgcfhz=1
    SET @ccgcfhzms=''

  END

GO

楼主试着拆了游标吧。等于推翻了现有的语句格式,重新设计下
[解决办法]
慢慢调试.蹭分.
[解决办法]
数据仓库的特点就是特大数据量,用游标死的更快,OLTP系统用游标还勉强说得过去。
[解决办法]
数据库要试着用集合的思路解决问题

热点排行