写一个存储过程,该存储过程参数要求如下:
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
---表分割函数
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')