读书人

请问动态拼接字段的表怎么在后面引用

发布时间: 2013-07-01 12:33:04 作者: rapoo

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



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

读书人网 >SQL Server

热点推荐