写一个存储过程

0 views
Skip to first unread message

goag...@gmail.com

unread,
May 7, 2006, 8:15:44 PM5/7/06
to goagrass
有几个表:A、B、C、D 这四个表都有字段users
该字段用途就是存储用户权限,值的格式为"id1,id2,id3",这个存储过程的用途主要是对这四张表的users值进行修改,以达到拥有的权限变化.

写一个存储过程,该存储过程参数要求如下:
CREATE PROCEDURE cphelp_admin_case_users
(
@OpMode varchar(20),-------@OpMode
为"ADD"代表添加、为DEL代表删除
@Users varchar(100),------@Users
为存储用户权限,格式为id1,id2,id3.....
                ---格式就是以“,”分隔
@CaseType
varchar(100)-------@CaseType为表名的,值如果为空时,表示操作A、B、C、D

--------,如果不为空时,按照表名循环操作,比如值为"A,B,C,D"

--------,那么对A、B、C、D都操作,格式就是以“,”分隔
)

AS
//////////下面的就交给您了,如何实现?谢谢~~~~~~~~~
例如:
如果执行 cphelp_admin_case_users 'ADD ' 'id1,id2,id3,id4'
'A,B,C,D'
如果执行之前数据表A,B,C,D字段users的值都为'id1,id2,id3' 那么这四张表的users值只能增加id4,这时users字段的值都也就是'id1,id2,id3,id4';

如果执行 cphelp_admin_case_users 'DEL ' 'id1,id2'
'A,B,C,D'
如果执行之前数据表A,B,C,D字段users的值都为'id1,id2,id3' 那么这四张表的users值都要删除'id1,id2',这时users字段的值都也就是'id3';


tntzbzc(华裔大魔王—抗日英雄—抗日要从娃娃抓起)
tnt...@hotmail.com

.net
panyug...@hotmail.com


---表分割函数
CREATE FUNCTION dbo.TBname( @tbname nvarchar(1000),@count int)
RETURNS nvarchar(1000)
BEGIN
declare @ii int
declare @mc int
declare @str nvarchar(100)
set @mc=1
set @ii=patindex('%,%',@tbname)
if @ii=0
return @tbname
while @mc<=@count
begin
if @ii=0
return @tbname
set @str=substring(@tbname,1,@ii-1)
set @tbname=stuff(@tbname,1,@ii,'')
set @ii=patindex('%,%',@tbname)
set @mc=@mc+1
end
return @str
end


----Users分割函数
CREATE FUNCTION dbo.KPI( @x nvarchar(1000),@y nvarchar(1000))
RETURNS nvarchar(1000)
BEGIN
declare @count int

declare @i int
declare @ii int
declare @str nvarchar(1000)
set @count=len(@y)-len(replace(@y,',',''))
if @count<>0
begin
set @i=1
set @ii=patindex('%,%',@y)
while @i<=@count+1
begin
set @str=substring(@y,1,@ii-1)
set @y=stuff(@y,1,@ii,'')
set @ii=patindex('%,%',@y)
set @i=@i+1
set @x=replace(@x,@str,'')
set @i=@i+1
end
end
set @x=replace(@x,@y,'')
set @x=(replace(replace(replace(replace(ltrim(rtrim(replace(@x,',','
'))),' ',','),',,',','),',,',','),',,',','))
return @x
end

---主存储过程

CREATE PROCEDURE cphelp_admin_case_users
(
@OpMode varchar(20),
@Users varchar(100),
@CaseType varchar(100)
)
as

declare @sql nvarchar(4000)
declare @len int
declare @i int select @i=0

if (@OpMode='ADD')
begin
set @len=len(@CaseType)-len(replace(@CaseType,',',''))
while @i<=@len
begin
set @sql=' update '+dbo.TBname(@CaseType,@i+1)+' set ShareEmpID
='''+@Users+''''
print @sql
set @i=@i+1
exec(@sql)
end
end
if (@OpMode='DEL')
begin

set @len=len(@CaseType)-len(replace(@CaseType,',',''))
while @i<=@len
begin
set @sql='update '+dbo.TBname(@CaseType,@i+1)+' set ShareEmpID =
dbo.KPI(ShareEmpID,'+''''+@Users+''''+')'
print @sql
set @i=@i+1
exec(@sql)
end
end
GO

--调试过程
exec [dbo].[cphelp_admin_case_users] 'add', '12,23,83,4545,2323',
'aa,bbb'
--结果
表aa
ShareEmpID
12,23,83,4545,2323

表bbb
ShareEmpID
12,23,83,4545,2323

--调试过程
exec [dbo].[cphelp_admin_case_users] 'del', '4545,2323', 'aa'
--结果
表aa
ShareEmpID
12,23,83

表bbb
ShareEmpID
12,23,83,4545,2323

CREATE PROCEDURE cphelp_admin_case_users
(
@OpMode varchar(20),-------@OpMode
为"ADD"代表添加、为DEL代表删除
@Users varchar(100),------@Users
为存储用户权限,格式为id1,id2,id3.....
                ------格式就是以“,”分隔
@CaseType
varchar(100)-------@CaseType为表名的,值如果为空时,表示操作A、B、C、D

--------,如果不为空时,按照表名循环操作,比如值为"A,B,C,D"

--------,那么对A、B、C、D都操作,格式就是以“,”分隔
declare @sql nvarchar(4000)
declare @len int
declare @i int select @i=0
if (@opmode='add')
begin
set @casetype=replace(@casetype,',','')
set @len=len(@casetype)
while @i<@len
begin
set @sql=@sql+' update '+substring(@casetype,@i+1,1)+' set users
='+@Users
+' where ..............'--条件自定
set @i=@i+1
end
end
if (@opmode='DEL')
begin

set @casetype=replace(@casetype,',','')
set @len=len(@casetype)
while @i<@len
begin
set @sql=@sql+' update '+substring(@casetype,@i+1,1)+' set users =
dbo.KPI(users,'+@Users+')'
+' where ..............'--条件自定
set @i=@i+1
end
end
exec(@sql)
)

---自定义函数

CREATE FUNCTION dbo.KPI( @x nvarchar(1000),@y nvarchar(1000))
RETURNS nvarchar(1000)
BEGIN
declare @i int
set @i=0
set @x=replace(@x,',',' ')
set @y=replace(@y,',','')
while @i<len(@y)/3
begin
set @x=replace(@x,substring(@y,@i*3+1,3),'')
set @i=@i+1
end
set @x=replace(replace(ltrim(@x),' ',','),',,',',')
return @x
end

/****************************************
--@Str:要分割的字符串
--@Split:分割字符
--@Dist:是否去除重复项 1:表去除重复项
--@OpMode 1:表添加
--@Users 2:要处理的权限
*****************************************/
if not object_id('GetRecords') is null
drop function GetRecords
go

create function GetRecords(
@str varchar(2000),
@split varchar(20),
@Dist bit,
@OpMode bit,
@Users varchar(100)
)
returns varchar(1000)
as
begin
declare @s varchar(2000)
declare @r varchar(2000)
declare @i varchar(2000)
Declare @Len smallint
declare @ReturnStr varchar(1000)
declare @Rec table (Record varchar(40))

select @ReturnStr=''

select @Len=len(@Split)
set @s=@str
if @OpMode=1
set @s=@s+','+@Users
set @i=CHARINDEX(@split,@s)
while @i>0
begin
set @r=left(@s,@i-1)
if @Dist=1
begin
if not exists(Select 1 from @rec where Record=@r)
insert @Rec values (@R)
end
else
begin
insert @Rec values (@R)
end

set @s=right(@s,len(@s)-@i-(@len-1))
set @i=CHARINDEX(@Split,@s)
end
if len(@s)>0
if @Dist=1
begin
if not exists(Select 1 from @rec where Record=@s)
insert @Rec values (@s)
end
else
begin
insert @Rec values (@s)
end

if @OpMode<>1
delete from @Rec where charindex(Record+@split,@Users+@split)>0

--得到字符串
select @ReturnStr=@ReturnStr+record+@split from @Rec
if @ReturnStr is null set @ReturnStr=''

if @ReturnStr<>''
select @ReturnStr=left(@ReturnStr,len(@ReturnStr)-len(@split))

return @ReturnStr
end
go

--去除
select dbo.GetRecords('1,2,3,4,5,6',',',1,0,'4,3,5,7')


--添加
select dbo.GetRecords('1,2,3,4,5,6',',',1,1,'4,3,5,7')

Reply all
Reply to author
Forward
0 new messages