有几个表: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';请问如何实现这样的功能呢?求求各位帮助小弟,小弟在此不胜感激!!!!!!!!!!
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';请问如何实现这样的功能呢?求求各位帮助小弟,小弟在此不胜感激!!!!!!!!!!
(
@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='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='update '+substring(@casetype,@i+1,1)+' set users = dbo.KPI(users,'+@Users+')'
+' where ..............'--条件自定
set @i=@i+1
end
end
)---自定义函数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
(
@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
我在查询分析器执行 cphelp_admin_case_users 'add' '12,23' '表名,表名'时出错了:服务器: 消息 170,级别 15,状态 1,行 1
第 1 行: '12,23' 附近有语法错误。是什么原因呢?麻烦你大人再帮帮解决了,谢谢~~~~
我执行了EXEC cphelp_admin_case_users 'add','12,23','表名,表名' ,但是还是users字段值没有变化,请回复,太感谢你了
你有空加我
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 intdeclare @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)
)
asdeclare @sql nvarchar(4000)
declare @len int
declare @i int select @i=0if (@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
--@Str:要分割的字符串
--@Split:分割字符
--@Dist:是否去除重复项 1:表去除重复项
--@OpMode 1:表添加
--@Users 2:要处理的权限
*****************************************/
if not object_id('GetRecords') is null
drop function GetRecords
gocreate 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')
tntzbzc(华裔大魔王—抗日英雄—抗日要从娃娃抓起)已经帮助我实现了,呵呵~~~~~祝好人有好报~~~~~~~~~~~~~~~~~~~~~~
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
select @ii=patindex('%,%',@y),@x=','+@x+','
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=reverse(stuff(reverse(stuff(@x,1,1,'')),1,1,''))
return @x
end
RETURNS nvarchar(1000)
BEGIN
declare @count int
declare @i int
declare @ii int
declare @str nvarchar(1000)
set @count=len(@y)-len(replace(@y,',',''))
select @x=','+@x+','
if @count<>0
begin
set @i=1
select @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=reverse(stuff(reverse(stuff(@x,1,1,'')),1,1,''))
return @x
end