创建操作环境:
Create Table #Function
(
 id int,
 name varchar(20)
)
Create Table #GroupAccessible
(
 GroupID int,
 TargetGroupID int,
 BatchPermissionID int
)
create Table #BatchPermission
(
 BatchID int,  
 FunctionID int,
 Editable bit
)
insert into  #Function values(1,'CompanyName')
insert into  #Function values(2,'Fax No')
insert into  #Function values(3,'FatherName')
insert into  #Function values(4,'MotherName')
insert into  #BatchPermission values(1,1,1)
insert into  #BatchPermission values(1,2,1)
insert into  #BatchPermission values(1,3,1)
insert into  #BatchPermission values(2,1,1)
insert into  #BatchPermission values(2,2,1)
insert into  #BatchPermission values(2,3,0)
insert into  #BatchPermission values(2,4,0)
insert into  #GroupAccessible values(1,2,1)
insert into  #GroupAccessible values(1,250,2)
下面这一段sql会返回一个结果集,其他table会join这个结果集,
由于用的非常频繁,请问如果把这一段封装起来,不需要每次使用的时候都重写一次?
想过用存储过程封装起来但是返回的结果集不能直接在select语句中join,请问有没有其他好办法?注:是用的sqlserver2000,所以用不了2005中的PIVOT/UNPIVOTdeclare @subsql varchar(4000)
set @subsql = 'select BatchID'
select @subsql = @subsql + ',sum(case FunctionID when '+Convert(varchar(2),FunctionID)+' then Convert(int,Editable) end) ['+Convert(varchar(4),FunctionID)+']'
from (select distinct FunctionID from #BatchPermission) as a
set @subsql = @subsql+' from #BatchPermission group by BatchID'declare @sql varchar(8000)
set @sql ='
select GroupID,TargetGroupID,Per.* from #GroupAccessible GA 
Inner join 
('+@subsql+'
)Per on GA.BatchPermissionID = Per.BatchID'exec (@sql)

解决方案 »

  1.   

    set @subsql = 'select BatchID into 表'然后从表里取数据.
      

  2.   

    haha,我没表达清楚吧.declare @subsql varchar(4000)
    set @subsql = 'select BatchID'
    select @subsql = @subsql + ',sum(case FunctionID when '+Convert(varchar(2),FunctionID)+' then Convert(int,Editable) end) ['+Convert(varchar(4),FunctionID)+']'
    from (select distinct FunctionID from #BatchPermission) as a
    set @subsql = @subsql+' from #BatchPermission group by BatchID'declare @sql varchar(8000)
    set @sql ='
    select GroupID,TargetGroupID,Per.* from #GroupAccessible GA 
    Inner join 
    ('+@subsql+'
    )Per on GA.BatchPermissionID = Per.BatchID'exec (@sql)我是想说整个拼起来的@sql会经常被使用到,也就是最后exec的那段sql经常会被用到,我想把整段封装起来.
      

  3.   

    --用触发器和视图解决Create Table [Function]
    (
     id int,
     name varchar(20)
    )
    Create Table GroupAccessible
    (
     GroupID int,
     TargetGroupID int,
     BatchPermissionID int
    )
    create Table BatchPermission
    (
     BatchID int,  
     FunctionID int,
     Editable bit
    )
    go
    create trigger tr_BatchPermission on BatchPermission
    for delete,update,insert
    as
    if exists(select 1 from sysobjects where name = 'v_tmp' and xtype = 'v')
    drop view v_tmp
    declare @subsql varchar(4000)
    set @subsql = 'select BatchID'
    select @subsql = @subsql + ',sum(case FunctionID when '+Convert(varchar(2),FunctionID)+' then Convert(int,Editable) end) ['+Convert(varchar(4),FunctionID)+']'
    from (select distinct FunctionID from BatchPermission) as aset @subsql = @subsql+' from BatchPermission group by BatchID'declare @sql varchar(8000)
    set @sql ='
    create view v_tmp
    as
    select GroupID,TargetGroupID,Per.* 
    from GroupAccessible GA 
    Inner join ('+@subsql+')Per on GA.BatchPermissionID = Per.BatchID'
    exec (@sql)
    go
    insert into  [Function] values(1,'CompanyName')
    insert into  [Function] values(2,'Fax No')
    insert into  [Function] values(3,'FatherName')
    insert into  [Function] values(4,'MotherName')
    insert into  BatchPermission values(1,1,1)
    insert into  BatchPermission values(1,2,1)
    insert into  BatchPermission values(1,3,1)
    insert into  BatchPermission values(2,1,1)
    insert into  BatchPermission values(2,2,1)
    insert into  BatchPermission values(2,3,0)
    insert into  BatchPermission values(2,4,0)
    insert into  GroupAccessible values(1,2,1)
    insert into  GroupAccessible values(1,250,2)
    go
    --以后只要调用这个视图就可以了
    select * from v_tmp
    go 
    drop table [Function],GroupAccessible,BatchPermission
    drop view v_tmp
      

  4.   

    把这段封装成存储过程如:p_result调用时将 p_result 的结果集放到临时表:create table #tmp()
    insert #tmp exec p_result这样就关联 #tmp 查
      

  5.   

    如果BatchPermission中插入或者删除了数据,触发器会自动重新生成视图