2010-11-26 73 views
0

在SQL Server 2008中,我有一個執行復雜查詢的存儲過程。我會將結果寫入臨時表(不是系統臨時表,而是手動管理的表)。動態引用表而不使用動態SQL

表的名稱是用戶的Web會話ID的字符串表示形式。這解決了併發問題。這將被傳遞給存儲過程,它將創建表。要進行清理,名稱將被記錄在維護表中,並附帶一個時間戳記。

但是,名稱顯然是動態的。我不想使用動態SQL,因爲這會排除複雜查詢的任何編譯。我知道這是推動的事情,但我想要做的是如下:

DECLARE @TableName varchar(100) 
SET @TableName = CAST(@SessionID AS varchar) 

INSERT INTO @TableName 
SELECT....{complex query} 

我該怎麼做?

更多信息:

的記錄可能是行(僅標識)的數萬人。用戶可以對這個記錄集應用進一步的過濾,從而減少它。因此它必須是服務器上的表格。

回答

1

爲什麼不創建臨時表的選擇,但包括會話ID作爲一個字段,這將使記錄獨特?

1

它如何編譯一個查詢與表,它不知道任何關於在編譯時?據我所知,你想做什麼是不可能的。

爲什麼不尋找其他解決方案,比如將結果存儲在以會話ID爲關鍵字的表中的XML字段中,每個用戶/會話/結果集一行?

您還可以將數據回送到.NET並將其直接存儲在Session中。取決於你使用哪個會話提供程序,這將如何工作。

您也可以將結果存儲在臨時文件中,並使用時間戳跟蹤單個表中的文件,並經常運行批處理作業以清除較舊或非活動會話中的文件。

增加的基礎上, 「更多信息」:

確定。時間玩「過早優化」卡。 :)

您是否有現有的解決方案已經太慢?你有沒有看過它的方法來簡化它而不緩存大的結果集?

假設您有:您期望擁有多少用戶/會話?這些ID如何被隔離和緩存後使用?他們聽起來像進一步查詢需要它們,這意味着他們最好的地方是在一個靜態名稱的表中。

此時我的建議是:將所有結果存儲在關聯表中,如create table tempResults(session_id guid, other_id int)。然後,您可以將此表中的連接硬編碼到其他查詢中。

+0

「SELECT FROM」是固定部分,因此可編譯。只有「INSERT INTO」是動態的。從字面上看,QUERY是固定的,它只是*我將結果寫入這些更改。記錄集可能有成千上萬行,因此不適合會話變量。臨時文件是一個想法! – IamIC 2010-11-26 17:02:04

+0

啊,臨時文件的問題是用戶可以應用過濾,這將減少記錄集。所以它必須是服務器上的表格。 – IamIC 2010-11-26 17:04:16

+0

有道理,我已經相應地更新了我的答案。 – mlibby 2010-11-26 17:21:39

1

您可以先將複雜查詢插入到#temp表中,然後使用動態sql將其插入sessionID命名錶中。

select ... 
into #temp 
....{complex query} 

set @sql = 'select * into ' + @tablename + ' from #temp' 
exec (@sql)