好贷网好贷款

头一次写SQL存储过程代码,请高手给评价一下,哪里不好请帮忙说说,第一次写不知道这样写性能如何!请各位帮忙指定!谢谢! 10分,无满意结帖,结帖人xsan_3]

发布时间:2016-12-3 10:26:50 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"头一次写SQL存储过程代码,请高手给评价一下,哪里不好请帮忙说说,第一次写不知道这样写性能如何!请各位帮忙指定!谢谢! 10分,无满意结帖,结帖人xsan_3]",主要涉及到头一次写SQL存储过程代码,请高手给评价一下,哪里不好请帮忙说说,第一次写不知道这样写性能如何!请各位帮忙指定!谢谢! 10分,无满意结帖,结帖人xsan_3]方面的内容,对于头一次写SQL存储过程代码,请高手给评价一下,哪里不好请帮忙说说,第一次写不知道这样写性能如何!请各位帮忙指定!谢谢! 10分,无满意结帖,结帖人xsan_3]感兴趣的同学可以参考一下。

CREATE PROCEDURE [sp_AddClass]    @ClassID int,    @ClassName NVarChar(50),    @ClassNameColor VarChar(10),    @ClassNameFont NVarChar(20),    @ClassExplain NVarChar(50),    @ClassParent Int,    @OpenWin Bit,    @ClassDir NVarChar(50),    @ShowGroup Int,    @SetTemplates Int,    @OpenOrClose Bit,    @ChannelID Int,    @OutLink Bit,    @LinkUrl VarChar(500),    @ShowCount Int AS declare @MaxRoot int,    @RootID Int,    @Depth Int,    @orderid Int,    @ParentStr VarChar(50),    @ChildNum Int,    @ChildStr VarChar(50), --开始添加内容 if @ClassID=0 begin   if @ClassParent=0 --如果属于一级分类     begin --开始        set @MaxRoot=(select Max(RootID) from duoe_class where [email protected])        if  (@MaxRoot is NULL)          begin   set @RootID=1  end    else      begin    set @RootID=(@MaxRoot+1)  end     set @orderid=1 set @Depth=0 set @[email protected] set @ChildNum=0 set @ChildStr='0'     end --结束    else --如果不是一级分类      begin     set @RootID=(select RootID from duoe_class where [email protected]) set @Depth=((select [Depth] from duoe_class where [email protected])+1)  end insert into duoe_class( [ClassName], [ClassNameColor], [ClassNameFont], [ClassExplain], [ClassParent], [OpenWin], [ClassDir], [ShowGroup], [SetTemplates], [OpenOrClose], [ChannelID], [RootID], [Depth], [orderid], [ParentStr], [ChildNum], [ChildStr], [OutLink], [LinkUrl], [ShowCount] ) values( @ClassName, @ClassNameColor, @ClassNameFont, @ClassExplain, @ClassParent, @OpenWin, @ClassDir, @ShowGroup, @SetTemplates, @OpenOrClose, @ChannelID, @RootID, @Depth, @orderid, @ParentStr, @ChildNum, @ChildStr, @OutLink, @LinkUrl, @ShowCount )   end else--修改更新内容 update duoe_class set [ClassName][email protected],[ClassNameColor][email protected],[ClassNameFont][email protected],[ClassExplain][email protected],[OpenWin][email protected],[ClassDir][email protected],[ShowGroup][email protected],[SetTemplates][email protected],[OpenOrClose][email protected],[OutLink][email protected],[LinkUrl][email protected],[ShowCount][email protected] where [ClassID][email protected] GO

由于不知道SQL语句里SQL循环怎么搞,所有注释了一部分内容, CREATE PROCEDURE [sp_AddClassNew]    @ClassID int,    @ClassName NVarChar(50),    @ClassNameColor VarChar(10),    @ClassNameFont NVarChar(20),    @ClassExplain NVarChar(50),    @ClassParent Int,    @OpenWin Bit,    @ClassDir NVarChar(50),    @ShowGroup Int,    @SetTemplates Int,    @OpenOrClose Bit,    @ChannelID Int,    @OutLink Bit,    @LinkUrl VarChar(500),    @ShowCount Int AS declare @MaxRoot int,    @RootID Int,    @Depth Int,    @orderid Int,    @ParentStr VarChar(200),    @ChildNum Int,    @ChildStr VarChar(50) --开始添加内容 if @ClassID=0 begin   if @ClassParent=0 --如果属于一级分类     begin --开始        set @MaxRoot=(select Max(RootID) from duoe_class where [email protected])        if  (@MaxRoot is NULL)          begin   set @RootID=1  end    else      begin    set @RootID=(@MaxRoot+1)  end     set @orderid=1 set @Depth=0 set @[email protected] set @ChildNum=0 set @ChildStr=''     end --结束    else --如果不是一级分类      begin     set @RootID=(select RootID from duoe_class where [email protected])     set @Depth=((select [Depth] from duoe_class where [email protected])+1)              declare @ParentStrNew varchar(200)              set @ParentStrNew=(select [ParentStr] from duoe_class where [email protected])              if(@ParentStrNew='0') --获得ParentStr,所有上级                begin                 set @[email protected]                end               else                 begin                  set @[email protected]+','+LTRIM(str(@ClassParent))                 end               set @ChildNum=0               set @ChildStr=''               --获得orderID               declare @NewOrderID int               set @NewOrderID=(select Max(orderid) from duoe_class where [email protected] and [email protected])               if(@NewOrderID is NULL)                 begin                   set @orderid=(select [orderid] from duoe_class where [email protected])                 end                else                  begin                    set @[email protected]                   end                --更新比现有的orderid大的值+1                update duoe_class set orderid=orderid+1 where [email protected] and orderid>@orderid                --更新所有父类的孩子值与孩子数                --declare @NewChild varchar(200),@NewChildStr varchar(200),@NewClassID int                --set @NewClassID=((select Max(ClassID) from duoe_class)+1)                --set @NewChild=(select [ChildStr] from duoe_class where [email protected])    declare @SqlStr varchar(2000)    --if(@NewChild='')      --set @[email protected]     --else --set @NewChildStr=','+LTRIM(str(@NewClassID))                set @SqlStr = 'update duoe_class set ChildNum=ChildNum+1 where ClassID in([email protected]+')'    exec (@SqlStr)                set @orderid=(@orderid+1)      end insert into duoe_class( [ClassName], [ClassNameColor], [ClassNameFont], [ClassExplain], [ClassParent], [OpenWin], [ClassDir], [ShowGroup], [SetTemplates], [OpenOrClose], [ChannelID], [RootID], [Depth], [orderid], [ParentStr], [ChildNum], [ChildStr], [OutLink], [LinkUrl], [ShowCount] ) values( @ClassName, @ClassNameColor, @ClassNameFont, @ClassExplain, @ClassParent, @OpenWin, @ClassDir, @ShowGroup, @SetTemplates, @OpenOrClose, @ChannelID, @RootID, @Depth, @orderid, @ParentStr, @ChildNum, @ChildStr, @OutLink, @LinkUrl, @ShowCount )   end else--修改更新内容 update duoe_class set [ClassName][email protected],[ClassNameColor][email protected],[ClassNameFont][email protected],[ClassExplain][email protected],[OpenWin][email protected],[ClassDir][email protected],[ShowGroup][email protected],[SetTemplates][email protected],[OpenOrClose][email protected],[OutLink][email protected],[LinkUrl][email protected],[ShowCount][email protected] where [ClassID][email protected] GO

       set @MaxRoot=(select Max(RootID) from duoe_class where [email protected])+1        if  (@MaxRoot is NULL)           set @RootID=1

好长

确实好长.

粗略估计有好几万行,呵呵

给点且实际的建议吧。第一次搞这个

计算和数据处理尽量放到应用程序处理 就这点建议

像 set @orderid=1         set @Depth=0         set @[email protected]         set @ChildNum=0         set @ChildStr='' 完全可以写成一个语句 select @orderid=1,@Depth=0,@[email protected],@ChildNum=0, @ChildStr='' 另外,你的表结构设计的很不合理,所以导致存储过程如此复杂 你的ClassParent字段,因为是一个多对多组合的字段,所以应该分离成一个细表!

几点建议: set @MaxRoot=(select Max(RootID) from duoe_class where [email protected])        if  (@MaxRoot is NULL)          begin           set @RootID=1          end        else          begin            set @RootID=(@MaxRoot+1)          end         set @orderid=1         set @Depth=0         set @[email protected]         set @ChildNum=0         set @ChildStr='0' [email protected],就没有必要使用 set @MaxRoot=(select...) 直接  IF EXISTS(SELECT 1 FROM ....) BEGIN END ELSE BEGIN END 再有:         set @orderid=1         set @Depth=0         set @[email protected]         set @ChildNum=0         set @ChildStr='0' 感觉SELECT @orderid=1=,@Depth=0,....这样更少行。其他地方也是如此。 以上只是个人意见了。     

set @RootID=(select RootID from duoe_class where [email protected]) 可以简单这样写: select @RootID=RootID from duoe_class where [email protected]

上一篇:跨天查询问题 20JJkukow]
下一篇:我在使用mysql的时候,需要向我已经建立好的表内插入很多内容。sqlserver有很好的外部工具可以导入。mysql有没有啥好的导入方法? 20分,无满意结帖,结帖人caobanglei]

相关文章

相关评论