(1)第一个视图:V1 ID   CaseName   RoleID   MenuID  1    第一个     2         12
 
  1    第一个     2         13
  
  1    第一个     3         11  2    第二个     2         14
  
  3    第三个     2         12(2)我现在要转入一个条件;RoleID=2视图就会显示为:
 ID   CaseName   RoleID   MenuID  1    第一个     2         12
 
  1    第一个     2         13
  
  2    第二个     2         14  3    第三个     2         12
(3)然后我再接的对它进行操作;使它可以变成;
 ID   CaseName   RoleID   MenuID  1    第一个     2       12,13  2    第二个     2       14  3    第三个     2       12
然后我再通过分页存储过程来调用这个视图;现在是关键上面那几步要怎么写啊!因为我现在手上有和一个视图的,但要根据第二个动态传进来的条件(RoleID=x)(到时就是传参进来的)来显示出另个视图,然后才对它进行第三步操作最终返回一个视图;
要用什么办法实现啊!是表值函数还是什么的..不管怎么实现的只要可以实现就可以的!大家随便把代码贴出来实现的!小弟数据库不强!现在程序卡在这...谢谢的....

解决方案 »

  1.   

    select ID,CaseName,RoleID,
          MenuID=stuff((select ','+rtrim(RoleID) from v1 where CaseName=a.CaseName and RoleID=a.RoleID),1,1,'')
    where RoleID=2
    frin v1 group by ID,CaseName,RoleID,
      

  2.   

    合并列值 
    --*******************************************************************************************
    表结构,数据如下: 
    id    value 
    ----- ------ 
    1    aa 
    1    bb 
    2    aaa 
    2    bbb 
    2    ccc 需要得到结果: 
    id    values 
    ------ ----------- 
    1      aa,bb 
    2      aaa,bbb,ccc 
    即:group by id, 求 value 的和(字符串相加) 1. 旧的解决方法(在sql server 2000中只能用函数解决。) 
    --=============================================================================
    create table tb(id int, value varchar(10)) 
    insert into tb values(1, 'aa') 
    insert into tb values(1, 'bb') 
    insert into tb values(2, 'aaa') 
    insert into tb values(2, 'bbb') 
    insert into tb values(2, 'ccc') 
    go 
    --1. 创建处理函数 
    CREATE FUNCTION dbo.f_strUnite(@id int) 
    RETURNS varchar(8000) 
    AS 
    BEGIN 
        DECLARE @str varchar(8000) 
        SET @str = '' 
        SELECT @str = @str + ',' + value FROM tb WHERE id=@id 
        RETURN STUFF(@str, 1, 1, '') 
    END 
    GO 
    -- 调用函数 
    SELECt id, value = dbo.f_strUnite(id) FROM tb GROUP BY id 
    drop table tb 
    drop function dbo.f_strUnite 
    go
    /* 
    id          value      
    ----------- ----------- 
    1          aa,bb 
    2          aaa,bbb,ccc 
    (所影响的行数为 2 行) 
    */ 
    --===================================================================================
    2. 新的解决方法(在sql server 2005中用OUTER APPLY等解决。) 
    create table tb(id int, value varchar(10)) 
    insert into tb values(1, 'aa') 
    insert into tb values(1, 'bb') 
    insert into tb values(2, 'aaa') 
    insert into tb values(2, 'bbb') 
    insert into tb values(2, 'ccc') 
    go 
    -- 查询处理 
    SELECT * FROM(SELECT DISTINCT id FROM tb)A OUTER APPLY( 
            SELECT [values]= STUFF(REPLACE(REPLACE( 
                ( 
                    SELECT value FROM tb N 
                    WHERE id = A.id 
                    FOR XML AUTO 
                ), ' <N value="', ','), '"/>', ''), 1, 1, '') 
    )N 
    drop table tb /* 
    id          values 
    ----------- ----------- 
    1          aa,bb 
    2          aaa,bbb,ccc (2 行受影响) 
    */ --SQL2005中的方法2 
    create table tb(id int, value varchar(10)) 
    insert into tb values(1, 'aa') 
    insert into tb values(1, 'bb') 
    insert into tb values(2, 'aaa') 
    insert into tb values(2, 'bbb') 
    insert into tb values(2, 'ccc') 
    go select id, [values]=stuff((select ','+[value] from tb t where id=tb.id for xml path('')), 1, 1, '') 
    from tb 
    group by id /* 
    id          values 
    ----------- -------------------- 
    1          aa,bb 
    2          aaa,bbb,ccc (2 row(s) affected) */ 
      

  3.   

    drop table tb
    go
    create table tb 
    (
    ID int,
    CaseName varchar(10),
    RoleID int,
    MenuID int
    )
    insert into tb values(1,'第一个',2,12)
    insert into tb values(1,'第一个',2,13)
    insert into tb values(1,'第一个',3,11)
    insert into tb values(2,'第二个',2,14)
    insert into tb values(3,'第三个',2,12)select id,CaseName,RoleID,
     MenuID=stuff((select ','+rtrim(MenuID) from tb t where RoleID=2 and id=tb.id and CaseName=t.CaseName and RoleID=t.RoleID  for xml path('')), 1, 1, '') 
    from tb 
    where RoleID=2  group by ID,CaseName,RoleID
      

  4.   

    ;with c1 as(
    select row_number()over(partition by id,casename order by menuid)rn,* from v1 where roleid=2
    )c2 as(
    select rn,id,casename,roleid,ltrim(menuid)menuid from c1 where rn=1
    union all
    select a.rn,b.id,b.casename,b.roleid,a.menuid+ltrim(menuid)menuid
    from c1 a inner join c2 b on a.rn=b.rn-1 and a.id=b.id and a.casename=b.casename
    )select id,casename,roleid,menuid from c2 where not exists(select 1 from c2 where id=a.id and casename=a.casename and rn>a.rn)
      

  5.   

    id          CaseName   RoleID      MenuID
    ----------- ---------- ----------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    1           第一个        2           12,13
    2           第二个        2           14
    3           第三个        2           12(3 行受影响)
      

  6.   

    select id,CaseName,RoleID,
         MenuID=stuff((select ','+rtrim(MenuID) from tb t where RoleID=2 and id=tb.id and CaseName=t.CaseName and RoleID=t.RoleID  for xml path('')), 1, 1, '') 
    from tb 
    where RoleID=2  group by ID,CaseName,RoleID
    这个是可以实现的!可是我怎么跟代码结合呢因为RoleID=2是代码那动态传来的!就像传参一样的!这个要怎么办啊!用数据库的什么写啊!带有ROLEID这个参数!我的程序就可能是来调用它的!让它返回一个视图然后分页存储过程再来调用这个显示出来...
      

  7.   


    create proc get_roleid
    @roleid int
    as
    begin
    select id,CaseName,RoleID,
      MenuID=stuff((select ','+rtrim(MenuID) from tb t where RoleID=2 and id=tb.id and CaseName=t.CaseName and RoleID=t.RoleID for xml path('')), 1, 1, '')  
    from tb  
    where RoleID=@roleid 
    group by ID,CaseName,RoleID
    end
      

  8.   

    每次调用完这个存储过程之后我的分页存储过程又要调用这个返回表的存储过程这样会不会很慢啊??我是用NET开发的!大家有什么好的建议呢
      

  9.   

    我把我的分页存储过程贴出来;
    set ANSI_NULLS OFF
    set QUOTED_IDENTIFIER OFF
    GO
    /*--通过唯一键分页查询--*/
    ALTER Proc [dbo].[P_Pagination]
    @QueryStr varchar(1000), --表名、视图名
    @PageSize int=10, --每页的大小(行数)
    @PageCurrent int=1, --要显示的页
    @FdShow varchar (1000)='*', --要显示的字段列表
    @Condition varchar(1000)='',--查询条件,不需要加where 
    @FdOrder varchar (1000)='', --排序字段列表
    @Unique varchar(50)=null--唯一字段
    as
    declare @SQL varchar(5000)
    declare @ocondition varchar(1000)
    set @ocondition=rtrim(ltrim(@Condition))
    if @Condition<>'' set @Condition=' where '+@Condition
    if @FdOrder<>'' set @FdOrder=' order by '+@FdOrder
    set @QueryStr=' '+@QueryStr+' '
    set @Unique=' '+@Unique+' 'set @SQL='select count(*) from '+@QueryStr+ @Condition+';';
    if @PageCurrent=1
    begin
        set @SQL=@SQL+'select top '+cast(@PageSize as varchar)+ @FdShow+' from '+@QueryStr+ @Condition +@FdOrder+';' 
    end
    else
    begin
    set @SQL=@SQL+'select top '+cast(@PageSize as varchar)+ @FdShow+' from '+@QueryStr+'
    where '+@Unique+' not in(select top '+cast((@PageSize*(@PageCurrent-1)) as varchar)+ @Unique +'from'+ @QueryStr+ @Condition+ @FdOrder+')';
    if(@ocondition<>'')
      set @SQL=@SQL+' and '+@ocondition +@FdOrder+';';
    else
      set @SQL=@SQL+ @FdOrder+';';
    end
    exec (@SQL)现在我这个要跟上面那个存储过程结合来;
    select id,CaseName,RoleID,
     MenuID=stuff((select ','+rtrim(MenuID) from tb t where RoleID=2 and id=tb.id and CaseName=t.CaseName and RoleID=t.RoleID for xml path('')), 1, 1, '') 
    from tb 
    where RoleID=2 group by ID,CaseName,RoleID分页存储过程中有个参数为表的名称;其实就不用传进来的!就写死吧!修改如下:但要传入一个ROLEID的参数;set ANSI_NULLS OFF
    set QUOTED_IDENTIFIER OFF
    GO
    /*--通过唯一键分页查询--*/
    ALTER Proc [dbo].[P_Pagination]
                   --@QueryStr varchar(1000), --表名、视图名
    @RoleID int,
    @PageSize int=10, --每页的大小(行数)
    @PageCurrent int=1, --要显示的页
    @FdShow varchar (1000)='*', --要显示的字段列表
    @Condition varchar(1000)='',--查询条件,不需要加where 
    @FdOrder varchar (1000)='', --排序字段列表
    @Unique varchar(50)=null--唯一字段
    as
    declare @SQL varchar(5000)
    declare @ocondition varchar(1000)
    set @ocondition=rtrim(ltrim(@Condition))
    if @Condition<>'' set @Condition=' where '+@Condition
    if @FdOrder<>'' set @FdOrder=' order by '+@FdOrder
    set @QueryStr=' '+@QueryStr+' '
    set @Unique=' '+@Unique+' 'set @SQL='select count(*) from '+@QueryStr+ @Condition+';';
    if @PageCurrent=1
    begin
        set @SQL=@SQL+'select top '+cast(@PageSize as varchar)+ @FdShow+' from '+@QueryStr+ @Condition +@FdOrder+';' 
    end
    else
    begin
    set @SQL=@SQL+'select top '+cast(@PageSize as varchar)+ @FdShow+' from '+@QueryStr+'
    where '+@Unique+' not in(select top '+cast((@PageSize*(@PageCurrent-1)) as varchar)+ @Unique +'from'+ @QueryStr+ @Condition+ @FdOrder+')';
    if(@ocondition<>'')
      set @SQL=@SQL+' and '+@ocondition +@FdOrder+';';
    else
      set @SQL=@SQL+ @FdOrder+';';
    end
    exec (@SQL)
    其中:@QueryStr是原来的表名;现在我们要用;select id,CaseName,RoleID,
     MenuID=stuff((select ','+rtrim(MenuID) from tb t where RoleID=@RoleID and id=tb.id and CaseName=t.CaseName and RoleID=t.RoleID for xml path('')), 1, 1, '') 
    from tb 
    where RoleID=@RoleID group by ID,CaseName,RoleID来代替;要怎么结合起来呢!
    就是上面那个返回一个表直接在分页存储过程代码里用!???