2017-02-09 142 views
0

外請參閱下面的代碼:創建動態SQL動態表,並引用它的動態SQL

select top 1 * into #dbusers from dbusers 

declare @tsql as varchar(1000) 
set @tsql = 'select * from #dbusers' 
exec (@tsql) 

這個工程,我所期望的,即一列由動態SQL返回。是否有可能做到這一點:

declare @tsql as varchar(1000) 
set @tsql = 'select top 1 * into #dbusers from dbusers' 
exec (@tsql) 

select * from #dbusers 

在這裏,我得到的錯誤:

Invalid object name '#dbusers'

有沒有解決辦法?

我知道你可以有動態SQL的輸出參數。但是,我也知道在使用存儲過程時,不能將表返回爲輸出參數。

可以做到這一點嗎?有沒有解決方法(除了創建物理表)?

+0

您可以使用##創建gloval臨時表,並使用兩種策略避免與其他會話發生衝突:爲表提供唯一名稱(例如guid)或將spid /用戶名稱作爲PK列。 – ajeh

+0

表值函數是一個選項嗎? – Serg

+1

也許首先解決真正的問題:爲什麼你需要首先在動態SQL中創建#temp表? –

回答

2

臨時表僅在創建它們的會話中可用。對於動態SQL,這意味着它在Dynamic SQL運行後不可用。在這裏你的選擇是:

  1. 創建一個全局臨時表中,將堅持你的會話外,直到它被顯式刪除或清理出另一種方式的TempDB,使用雙散列:create table ##GlobalTemp
    因爲該表仍然存在在會話之外,您需要確保不會創建其中的兩個或者有兩個不同的進程嘗試處理其中的數據。您需要有一種唯一標識要處理的全局臨時表的方法。
  2. 您可以創建一個常規表,並記住在之後再次放下。
  3. 包括任何需要引用動態SQL腳本

內的臨時表爲您的特定情況下,雖然邏輯,你是最好的關閉只是執行select into將從所選的數據生成你的表結構。

+0

感謝您參考全球臨時表。 +1。 – w0051977