2013-03-14 104 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') 
相關問題