2015-09-17 36 views
0

我遇到的問題如下:動態查詢SELECT INTO #TmpTbl不工作

DECLARE @TmpMemberTypeCount NVARCHAR(4000) 

SET @TmpMemberTypeCount = 
    N'SELECT DISTINCT 
     StoreID 
     ,AgreedDate 
     ,'+'''TotalCount'''+' as Type 
     ,'+ @MemberTypeCols + ' 
     INTO #TmpMemberTypeCount 
     FROM #TmpTbl as t 

     PIVOT 
     (
     SUM(CP_Count) 
     FOR MemberShipType 
     IN (' + @MemberTypePvt + ') 
    ) as p 
    GROUP BY StoreID 
     ,AgreedDate' 

EXEC (@TmpMemberTypeCount) 

當我運行此我沒有得到一個錯誤,但是,如果我嘗試運行

SELECT * FROM #TmpMemberTypeCount 

我得到的錯誤,基本上說,表尚未創建。

如果我將INTO #TmpMemberTypeCount更改爲INTO TmpMemberTypeCount一切正常。

是不是可以使用臨時表與動態查詢?

另一個需要注意的是,如果我將EXEC更改爲PRINT,然後運行打印的內容,則一切運行良好,並創建臨時表。

UPDATE:

我之所以需要使用#TmpTbl是因爲我轉出每家店的獨特membertypes。因此,如果用戶正在運行在同一時間這個報告中,USER1在#TmpTbl列可能是:

StoreID, 
AgreedDate, 
Type, 
User, -- MemberType1 
Admin, -- MemberType2 
Staff, -- MemberType3 

#TmpTbl,對於user2的列可能是:

StoreID, 
AgreedDate, 
Type, 
Trainer, -- MemberType1 
Chef, -- MemberType2 
CoatCheck, -- MemberType3 
Painter -- MemberType4 

的MemberTypes存儲在@MemberTypeColsTrainer, Chef, CoatCheck, Painter

+0

有一件事你忘了,**本地臨時表是每個上下文**使用EXEC你切換到不同的上下文,當完成EXEC時臨時表已經消失,當你使用普通表時,它不管上下文都會持久。 – lad2025

回答

0
當然


當你執行這個命令

EXEC (@TmpMemberTypeCount) 

查詢在新會話中進行,並帶有新的ID。

臨時表僅存在於創建的會話中。
當你執行的是命令

SELECT * FROM #TmpMemberTypeCount 

您正在執行一個不同的會話查詢


您必須使用真實的表或全局臨時teble ##

+0

使用全局臨時表,如果2個用戶同時運行此報告,他們都將使用同一個表?不像普通的臨時表,兩個用戶都有自己的表? – Doolius

+0

全局臨時表對所有SQL Server連接都可見。當你創建其中的一個時,所有的用戶都可以看到它。 –

0
DECLARE @TmpMemberTypeCount NVARCHAR(4000) 
SET @TmpMemberTypeCount = 
    N'SELECT DISTINCT 
     StoreID 
     ,AgreedDate 
     ,'+'''TotalCount'''+' as Type 
     ,'+ @MemberTypeCols + ' 
     INTO #TmpMemberTypeCount 
     FROM #TmpTbl as t 

     PIVOT 
     (
     SUM(CP_Count) 
     FOR MemberShipType 
     IN (' + @MemberTypePvt + ') 
    ) as p 
    GROUP BY StoreID 
     ,AgreedDate 

    SELECT * FROM #TmpMemberTypeCount' --<-- add this here 

EXEC (@TmpMemberTypeCount) 

動態SQL在動態SQL創建自己的作用域什麼是不可見於任何外部範圍

+0

是否有可能基本上做一個'EXEC(@TmpMemberTypeCount INTO #TmpTbl)'我知道這是行不通的,但沿着這些線。 – Doolius

0

創建臨時表在動態SQL中動態創建是在不同的會話中,這就是爲什麼它不能在你的情況下被訪問(如Mattia Caputo提到)。

一個快速和簡單的解決方法是動態SQL之前創建臨時表,然後就插入它:

if OBJECT_ID('tempdb..#TmpMemberTypeCount') is not null 
    drop table #TmpMemberTypeCount 

select * 
into #TmpMemberTypeCount 
from #TmpTbl 
where 1 = 0 

DECLARE @TmpMemberTypeCount NVARCHAR(4000) 
SET @TmpMemberTypeCount = 
    N' 
INSERT INTO #TmpMemberTypeCount (cols....) 
SELECT DISTINCT 
     StoreID 
     ,AgreedDate 
     ,'+'''TotalCount'''+' as Type 
     ,'+ @MemberTypeCols + '  
     FROM #TmpTbl as t 

     PIVOT 
     (
     SUM(CP_Count) 
     FOR MemberShipType 
     IN (' + @MemberTypePvt + ') 
    ) as p 
    GROUP BY StoreID 
     ,AgreedDate' 

EXEC (@TmpMemberTypeCount) 
+0

#TmpMemberTypeCount表可以使用顯式的create語句創建,以防需要更少的列(少於#TmpTbl) –

+0

我不認爲這會工作,因爲'#TmpTbl'中的內容不是我需要的格式'#TmpMemberTypeCount'。 #TmpTbl對每個MemberType都有一個ROW,而#TmpMemberTypeCount對於每個MemberType都需要一個COLUMN,而使事情複雜化的是,每個Store的MemberType是不同的,而且從來沒有相同的數字。 – Doolius

+0

然後,您應該使用顯式CREATE語句(使用適當的列和數據類型來存儲由dinamyc SQL中的select語句返回的值)來創建#TmpMemberTypeCount。 –