新手请教 存储过程优化
有如下两张表
想有一存储过程,由tb_GroupRole.RoleType查询tb_ClientGroup表中对应所有该GroupID的子组和其自身 的tb_ClientGroup.GroupID
比如RoleType为0,应该返回所有列;RoleType为1,返回000000000002,000000000003,000000000005,000000000006;RoleType为2,返回000000000004,
而且若附加GroupName判断,也须满足该判断条件
下边是我写的存储过程及测试结果,想请教各位大侠,是否有更好方法来实现或者优化这存储过程?这个感觉总太生硬了:(
create table tb_ClientGroup(GroupID varchar(100), GroupPath varchar(3700), GroupName varchar(1000))
insert into tb_ClientGroup values('000000000001', '', 'RootGroup')
insert into tb_ClientGroup values('000000000002', '000000000001', 'ChildOne')
insert into tb_ClientGroup values('000000000003', '000000000001', 'ChildTwo')
insert into tb_ClientGroup values('000000000004', '000000000001', 'ChildThree')
insert into tb_ClientGroup values('000000000005', '000000000001\000000000002', 'grandChildOne')
insert into tb_ClientGroup values('000000000006', '000000000001\000000000002', 'grandChildTwo')
--ChildOne,ChildTwo为RootGroup子组,grandChildOne和grandChildTwo为ChildOne子组(从GroupPath分析出的结果)
create table tb_GroupRole(GroupID varchar(100),RoleType int)
insert into tb_Grouprole values('000000000001', 0)
insert into tb_Grouprole values('000000000002', 1)
insert into tb_Grouprole values('000000000003', 1)
insert into tb_Grouprole values('000000000004', 2)
insert into tb_Grouprole values('000000000005', 3)
insert into tb_Grouprole values('000000000006', 3)
--tb_GroupRole.GroupID与tb_ClientGroup.GroupID相对应
想有一存储过程,由tb_GroupRole.RoleType查询tb_ClientGroup表中对应所有该GroupID的子组和其自身 的tb_ClientGroup.GroupID
比如RoleType为0,应该返回所有列;RoleType为1,返回000000000002,000000000003,000000000005,000000000006;RoleType为2,返回000000000004,
而且若附加GroupName判断,也须满足该判断条件
下边是我写的存储过程及测试结果,想请教各位大侠,是否有更好方法来实现或者优化这存储过程?这个感觉总太生硬了:(
create procedure dbo.GetGroupID
@GroupRole int,
@GroupName varchar(1000) = NULL
AS
DECLARE @strPath varchar(3700),
@strID varchar(100)
BEGIN
create table #tmpGroupID(GroupID varchar(100))
create table #tmpGroupIDAndPath(GroupID varchar(100), GroupPath varchar(3700))
--先把满足@GroupRole条件的所有数据存入#tmpGroupIDAndPath表
insert into #tmpGroupIDAndPath select GroupID,GroupPath from tb_ClientGroup where (tb_ClientGroup.GroupID in(
select GroupID from tb_GroupRole where tb_GroupRole.RoleType=@GroupRole
))
--按#tmpGroupIDAndPath表中GroupID值(该值具有唯一性)依逐条将满足要求的数据插入临时表#tmpGroupID
while (select count(*) from #tmpGroupIDAndPath)>0
BEGIN
select Top 1 @strID=GroupID,@strPath=GroupPath from #tmpGroupIDAndPath
--重新组合GroupPath条件
if len(@strPath) > 0
SET @strPath = @strPath + '\'+ @strID + '%'
else SET @strPath = @strID + '%'
insert into #tmpGroupID select GroupID from tb_ClientGroup where
(@GroupName IS NULL or tb_ClientGroup.GroupName like @GroupName)
AND (
(tb_ClientGroup.GroupPath like @strPath)
OR (tb_ClientGroup.GroupID = @strID)
)
delete from #tmpGroupIDAndPath where GroupID = @strID
END
--显示结果
select * from #tmpGroupID order by GroupID
DROP table #tmpGroupIDAndPath
drop table #tmpGroupID
END
--测试结果
exec dbo.GetGroupID
@GroupRole = 0
--GroupID
--000000000001
--000000000002
--000000000003
--000000000004
--000000000005
--000000000006
exec dbo.GetGroupID
@GroupRole = 1
--000000000002
--000000000003
--000000000005
--000000000006
exec dbo.GetGroupID
@GroupRole = 2
--000000000004
drop table tb_Grouprole
drop table tb_ClientGroup
...全文
相关推荐
sqlserver存储过程入门例子加讲解
这是本人收集的一篇关于sql存储过程的实例,都是讲解的最基本的存储过程,对一些新手应该会有很大的帮助。
C#调用存储过程简单实例
学习了简单的存储过程技术后,做了一个关于C#存储过程的简单实例,可以帮助理解C#如何调用SQL Server的存储过程技术,用winform做的小实例,代码有注释,希望和新手共勉
一个编程高手写给新手的话
一个高手写给新手的忠告,教你怎么去成长为编程高手 看完颇有感触
存储过程生成器
存储过程生成器,增删改查,还要下载学习研究!
MySQL存储过程详解[源码]
本文详细介绍了MySQL存储过程的核心概念、优势、局限性及实际应用。存储过程是预编译并存储在数据库中的SQL语句集合,具有性能提升、代码管理、安全增强等优势,但也存在学习成本高、调试困难等局限性。文章涵盖了存储过程的创建语法、调用方法、变量类型、参数模式、流程控制、游标使用、错误处理、修改删除及查看等操作。此外,还提供了存储过程的最佳实践、安全性考虑和调试建议,帮助读者从入门到精通掌握MySQL存储过程的使用。


