2010-10-15 94 views
0

長話短說...在SQL Server 2008中使用動態sql構建臨時表

我正在構建一個Web應用程序,用戶可以在其中選擇約40個參數的任意組合。然而,對於他們想要的結果之一(投資經驗),我必須從不同的表格中提取信息,並比較六個不同列中的值(股票期權,共同基金期權等),並僅返回六個最高值爲特定的記錄。

這不是問題。問題是,在運行時,我的查詢找到投資exp不一定知道帳戶ID。考慮到表掃描會帶來超過50萬的客戶,這不是一種選擇。所以我想要做的是編輯我的主動態構建查詢的副本,但不是返回30列,而是返回2,accountid和experienceid(這是體驗表的PK),所以我可以做過濾處理。

你們中的一些人可能會定義與我自己有點不同的動態SQL。我的查詢是一個字符串,根據發送給我的過程的參數,where子句的一部分將由開關打開或關閉。最後我執行,這一切都在服務器端完成,所有的Web應用程序都會向我的proc發送一個參數數組。

我在簡化代碼看起來基本上是這樣的:

declare @sql varchar(8000) 
set @sql = 
'select [columns] 
into #tempTable 
from [table] 
[table joins]' + @dynamicallyBuiltWhereClause 

exec(@sql) 
這一部分,我嘗試使用#tempTable的投資經驗,濾波處理後

,但我得到一個錯誤,告訴我#tempTable不存在。

任何和所有的幫助將不勝感激。

回答

2

問題是您的臨時表的範圍只存在於exec()語句中。您可以使用2個散列符號 - > ## tempTable將您的臨時錶轉換爲「全局」臨時表。不過,我想知道爲什麼你使用變量@dynamicallyBuiltWhereClause來生成你的SQL語句。

我已經做了你過去在做什麼,但有更好的成功從應用程序(使用C#來生成我的SQL)生成SQL。

此外,你可能想看看錶變量。我看到一些使用臨時表的應用程序重新使用連接並且最後一個查詢中的臨時表仍然存在的奇怪實例。

+0

以及我的程序將收到40多個默認爲null的參數,並且一系列值檢查將作爲切換來構建where子句。謝謝你,我完全忘記了範圍(我是新的)和2個散列符號。謝謝。 – IWriteApps 2010-10-15 16:41:00

相關問題