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是可以,但是这个多人操作会有很我问题。
不知还有什么解决方案。谢谢!
(
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是可以,但是这个多人操作会有很我问题。
不知还有什么解决方案。谢谢!
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)
字段数(列数)不确定的。
select * into #temp from A where 1=2这样仍假设了#temp与 A的结构一样,都是ID int, Name varchar(10)
但实际上,面里有多少列,不确定的。
这样的话,如果非要用临时表,可能只有这样了:
1. 全局临时表,可能你不愿意
2. 建个实体表,用完了手动删一下,临时表其实就是比实体表多了个自动删除(当会话断开时)
EXEC(N'select * into tmp from ....')
select * from tmp
drop tmp
本来全局临时表、或实体表也没问题,但是这个存储过程可能有多人执行。为了数据不混乱,那么可能得建多个全局临时表(每个登陆用户一个)。
这样其实也可以的,只是还想学习下,大家平时怎样处理这类情况的。谢谢!