2014-01-14 86 views
0
DECLARE @cols AS NVARCHAR(MAX); 
DECLARE @query AS NVARCHAR(MAX); 


select @cols = STUFF((SELECT distinct ',' + 
         QUOTENAME(hi) 
         FROM #hello 
         FOR XML PATH(''), TYPE 
        ).value('.', 'NVARCHAR(MAX)') 
         , 1, 1, ''); 
--select @cols       

上述代碼出於某種原因沒有輸入日期到#storage臨時表中? 這是爲什麼發生?動態查詢不寫入臨時表

select @query = 'SELECT * 
into #storage 
FROM (
SELECT * 
FROM #hello) up 
PIVOT (MAX(AFEAmount) FOR hi IN (' + @cols + ')) AS pvt' 

exec(@query) 

回答

1

代碼克里特臨時表#storage。問題在於表格不在「範圍內」,因此您無法在exec()聲明之外訪問該表格。臨時表在範圍限制到創建它們的特定過程。臨時表在exec()正在運行但不在其外部時可用。在文檔(here)中有一些解釋。

在某些情況下,您可以使用語句的insert . . . exec()形式來解決此問題。如果表是永久性的,你會構建create table語句,然後做:

insert into storage(...) 
    exec(@query); 

或者,你甚至可以做到這一點的動態SQL裏面,因爲永久表在會話之間持續存在。

在這種情況下,臨時表的問題是您不知道其結構。您需要在插入之前創建表格。變量結構需要動態SQL,並且在創建表時存在相同的問題。它創建於「錯誤」的小屋。

可能將表更改爲全局臨時表(以##開頭)。這對不同進程進行了範圍界定。或者,你可以用一個時髦的名字創建一個持久表(我將使用_storage_storage_YYYYMMDDHHMMSS,後者在最後有一個時間戳)。只要記得在完成後刪除表格。