我正在爲SQL Server 2008編寫一個存儲過程,其中需要從一組表中提取信息。我不知道那些表格的結構。在同一個數據庫中還有另一個表,告訴我該表中字段的名稱和類型。訪問在不同範圍內創建的SQL Server臨時表
我這樣做:
declare @sql nvarchar(max)
set @sql = 'select ... into #new_temporary_table ...'
exec sp_executesql @sql
Then I iterate doing:
set @sql = 'insert into #another_temporary_table ... select ... from #new_temporary_table'
exec sp_executesql @sql
之後,我刪除臨時表。這發生在一個循環中,所以這個表格會被創建,填充和刪除多次,每次都有不同的列。
這失敗,出現錯誤:
Invalid object name: #new_temporary_table.
一些谷歌上搜索,我發現之後:
#new_temporary_table
在調用的範圍創建exec sp_executesql
該表是從不同我的存儲過程之一。這是下一個exec sp_executesql
找不到表的原因。這篇文章解釋它: http://social.msdn.microsoft.com/forums/en-US/transactsql/thread/1dd6a408-4ac5-4193-9284-4fee8880d18a我可以使用全球臨時表,這是前
##
前。我不能這樣做,因爲多個存儲過程可以同時運行,它們會影響對方的狀態在這篇文章中說如果我發現自己在這種情況下我應該改變數據庫的結構。這是不是一種選擇對我來說: http://www.sommarskog.se/dynamic_sql.html
一個解決辦法我已經找到了所有的select into #new_temporary_table..
和所有的insert into ...
腳本組合成一個巨大的聲明。這工作正常,但它有一些缺點。
例如,如果我打印@sql來排除故障,文本會被截斷。
我還有其他的選擇嗎?所有想法都歡迎。
爲什麼不能像'#new_temporary_table_1'你的臨時表使用不同的名稱。另外,既然你正在放棄它們......你可以使用普通表格(staging table);在tempdb下創建它們。所以即使你錯過了放棄它們,它們也會自動消失。 – Rahul
你總結了很好的選項 - 「本地」臨時表(只在同一範圍內可見),全局臨時表,常規表 - 就是這樣。一種解決方案可能是在特定的模式下創建真實表格 - 存儲的特效同意;例如第一個存儲過程會創建'temp1'模式並將數據存儲在那裏,然後其他「屬於一起」的模式將全部使用該'temp1'模式作爲其表。第二次運行會使用'temp2'模式 - 依此類推... –