2013-03-14 75 views
-1

我正在使用select语句将数据复制到临时表,它会产生pivoting的结果。无法将数据复制到临时表使用SQL语句在sql - server 2008

我的程序是:

alter procedure proc11 AS 

create Table #Temp (Software varchar(max), Ver varchar(max)) 

declare @cols varchar(max) 
declare @colTabl varchar(max) 
declare @alter varchar(max) 

set @cols=STUFF((select distinct ',[' + Ltrim(rtrim(YEAR(Dt))) +']' from temp FOR XML PATH('')),1,1,''); 

set @colTabl=STUFF((select distinct '[' + Ltrim(rtrim(YEAR(Dt))) +'] int,' from temp FOR XML PATH('')),1,0,''); 

set @colTabl= LEFT(@colTabl,len(@colTabl)-1); 

set @alter = 'alter table #Temp add '+ @colTabl; 

exec(@alter) 

EXEC('select * into #Temp from 
(select YEAR(Dt)[year],Software,Ver from temp)T 
Pivot(count([year]) for [year] in ('[email protected]+'))PVT') 

但声明select * from #Temp没有返回记录。

如何复制这些记录。

请帮忙。提前致谢。

回答

0
EXEC('insert #Temp select * from 
(select YEAR(Dt)[year],Software,Ver from temp)T 
Pivot(count([year]) for [year] in ('[email protected]+'))PVT order by Software') 
0

这是因为'#'临时表仅在当前连接期间保留,并且仅在其范围内可见。即使您创建临时表,在SSMS中打开另一个选项卡并尝试使用它,您会看到“表不存在”错误。 会发生什么情况是,您的EXEC语句创建#Temp表,并且当它完成时,该表立即被删除。不仅如此 - 来自CREATE语句的#Temp表和来自EXEC语句的#Temp实际上是不同的表!尝试在不同的SSMS选项卡中创建两个#temp表格,你会发现它们实际上并不相同。

您可以使用全局临时表。只需将名称改为## Temp即可使用。 运行这两个例子。

这是行不通的:

EXEC('select * into #Temp from (select ''something'' as x) x'); 
select * from #Temp 

而这一次会(当你运行它第二次,你会发现 “表已经存在” 错误:

EXEC('select * into ##Temp from (select ''something'' as x) x'); 
select * from ##Temp 
0

或者只需从动态部分中删除INSERT

INSERT INTO #temp 
EXEC(select * from 
    (select YEAR(Dt)[year],Software,Ver from temp)T 
    Pivot(count([year]) for [year] in ('[email protected]+'))PVT order by Software') 
相关问题