create table tb
(
   Name    varchar(10) ,
   Subject varchar(10) ,
   Result  int
)insert into tb(Name , Subject , Result) values('张三' , '语文' , 74)
insert into tb(Name , Subject , Result) values('张三' , '数学' , 83)
insert into tb(Name , Subject , Result) values('张三' , '物理' , 93)
insert into tb(Name , Subject , Result) values('李四' , '语文' , 74)
insert into tb(Name , Subject , Result) values('李四' , '数学' , 84)
insert into tb(Name , Subject , Result) values('李四' , '物理' , 94)
go
declare @sql varchar(8000)
set @sql = 'select Name as ' + '姓名'
select @sql = @sql + ' , max(case Subject when ''' + Subject + ''' then Result else 0 end) [' + Subject + ']'
from (select distinct Subject from tb) as a
set @sql = @sql + 'into #temp from tb group by name'
exec(@sql) select * from #temp --对象名 '#temp' 无效。
这里生成的 #temp的列是不确定的,所以无法提前 Create table #temp。
用 ##temp是可以,但是这个多人操作会有很我问题。
不知还有什么解决方案。谢谢!

解决方案 »

  1.   

    把 'select * from #temp' 放到@sql里面.
      

  2.   


    declare @sql varchar(8000)
    set @sql = 'select Name as ' + '姓名'
    select @sql = @sql + ' , max(case Subject when ''' + Subject + ''' then Result else 0 end) [' + Subject + ']'
    from (select distinct Subject from tb) as a
    set @sql = @sql + 'into #temp from tb group by name ; select * from #temp '
    exec(@sql) 
      

  3.   

    to maco_wang   那假如select * from #temp 不想放在动态里面,有没有什么好的方法。谢谢!
      

  4.   

    select into 到真实表中,最前面,先判断这个真实表是否存在,存在就删除.
      

  5.   

    to dengixnyu##是全局的,多人使用会用问题。
      

  6.   

    to shoppo0505
    字段数(列数)不确定的。
      

  7.   

    由于exec()或者sp_executesql的上下文关系,里面定义的临时表,在外面无法引用的。但反过来可以。先创建个空的表,然后在exec()中做insert就行了:create table A (ID int, Name varchar(10))select * into #temp from A where 1=2EXEC(N'insert into #temp values(1,''T'')')select * from #temp
      

  8.   

    to seusoftwarecreate table A (ID int, Name varchar(10))
     
    select * into #temp from A where 1=2这样仍假设了#temp与 A的结构一样,都是ID int, Name varchar(10)
    但实际上,面里有多少列,不确定的。
      

  9.   


    这样的话,如果非要用临时表,可能只有这样了:
    1. 全局临时表,可能你不愿意
    2. 建个实体表,用完了手动删一下,临时表其实就是比实体表多了个自动删除(当会话断开时)
    EXEC(N'select * into tmp from ....')
    select * from tmp 
    drop tmp 
      

  10.   

    to seusoftware
    本来全局临时表、或实体表也没问题,但是这个存储过程可能有多人执行。为了数据不混乱,那么可能得建多个全局临时表(每个登陆用户一个)。
    这样其实也可以的,只是还想学习下,大家平时怎样处理这类情况的。谢谢!