日期:2014-05-17  浏览次数:20489 次

请教动态拼接字段的表,如何在后面引用


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是可以,但是这个多人操作会有很我问题。
不知还有什么解决方案。谢谢!

------解决方案--------------------
把 'select * from #temp' 放到@sql里面.
------解决方案--------------------

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) 

------解决方案--------------------
#temp  改成 ##temp
------解决方案--------------------
select into 到真实表中,最前面,先判断这个真实表是否存在,存在就删除.

------解决方案--------------------
由于exec()或者sp_executesql的上下文关系,里面定义的临时表,在外面无法引用的。

但反过来可以。

先创建个空的表,然后在exec()中做insert就行了:

create table A (ID int, Name varchar(10))

select * into #temp from A where 1=2

EXEC(N'insert into #temp values(1,''T'')')

select * from #temp