有几个表: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';请问如何实现这样的功能呢?求求各位帮助小弟,小弟在此不胜感激!!!!!!!!!!

解决方案 »

  1.   

    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='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
      

  2.   

    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
      

  3.   

    tntzbzc(华裔大魔王—抗日英雄—抗日要从娃娃抓起) 是个好心人,帮我写这么多,花了你不少时间了,真的太感动了,一定给你送分的
      

  4.   

    tntzbzc(华裔大魔王—抗日英雄—抗日要从娃娃抓起) 你好:
    我在查询分析器执行 cphelp_admin_case_users 'add' '12,23' '表名,表名'时出错了:服务器: 消息 170,级别 15,状态 1,行 1
    第 1 行: '12,23' 附近有语法错误。是什么原因呢?麻烦你大人再帮帮解决了,谢谢~~~~
      

  5.   

    调用语法错误EXEC cphelp_admin_case_users 'add','12,23','表名,表名'    --别忘了逗号
      

  6.   

    谢谢tntzbzc(华裔大魔王—抗日英雄—抗日要从娃娃抓起) 
    我执行了EXEC cphelp_admin_case_users 'add','12,23','表名,表名' ,但是还是users字段值没有变化,请回复,太感谢你了
      

  7.   

    晕哦这样讲不清了hotmail:  [email protected]
    你有空加我
      

  8.   

    ---表分割函数
    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
      

  9.   

    --调试过程
    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
      

  10.   

    /****************************************
    --@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')
      

  11.   

    tntzbzc(华裔大魔王—抗日英雄—抗日要从娃娃抓起) :你真是一个大好人,昨天下午你帮了我写这个SP花了不少时间,但由于我想要的SP功能意愿表达得不够准确,所以导致编写的时候给你带来了一些差异的问题,而且晚上你回家又不厌其烦地继续帮我实现,在这里我真的太感动了,我们从未谋面,你却能不歉麻烦和花这么多时间慷慨和侠义地帮我解决这个难题(也许好心帮助了不少人,值得敬佩),这才是真正的大师级风范!!!真是不胜感激,除了感谢,感谢,还是感谢~~~~~~~~~~~~~。刚才我用了你写的Function\SP都通过了,功能和我想要的一模一样,已经交差了,我这样感谢你是不够的,我会再给你加分,表达我深深地谢意!!!
      

  12.   

    ReViSion(和尚):也许你的方法也不错,很感谢你,也感谢大家~~~~
    tntzbzc(华裔大魔王—抗日英雄—抗日要从娃娃抓起)已经帮助我实现了,呵呵~~~~~祝好人有好报~~~~~~~~~~~~~~~~~~~~~~
      

  13.   

    偶也试了下,都可以实现,学习ing~~~~~
      

  14.   

    修改部分BUG
    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
      

  15.   

    上面那个有问提,用这个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,',',''))
    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
      

  16.   

    谢谢tntzbzc(华裔大魔王—抗日英雄—抗日要从娃娃抓起) ,这个可以了~~~