2013-01-08 30 views
0

我嘗試在單引號內創建一個臨時表,它顯示錯誤,它不能識別表 #newtable ...它只支持##table(全局臨時表),但我不想一個全球臨時表,我只是想要解釋它的背後原因是什麼。如何在單引號內創建臨時表

'select coulumn1, column2, column3, ##newtable.columnid as ShipProfile, 
     ROW_NUMBER() over (order by Id)as ''RowNumber'' 
into ##TempProduct 
from Product 
    left join ##newtable on Product.columnId=##newtable.ColumnId 
where MerchantId='+CONVERT(varchar(20),@MerchatID) 
+2

你是怎麼執行這個的?你說你沒有使用全局臨時表,但是在代碼中它們是用##定義的。 – SWeko

+0

我正在使用全球可溫度,而不是#temptable,我的問題是爲什麼我不能使用單引號內的#temptable – Thiyagarajan

回答

1

從著名的The Curse and Blessings of Dynamic SQL報價:

觀察接下來的事情是,動態SQL不是 存儲過程的一部分,但構成了它自己的範圍。調用 動態SQL塊類似於調用創建爲 的無名存儲過程ad-hoc。這有許多後果:因爲它們的動態SQL退出時掉落在動態SQL創建

...

  • 臨時表不會從 調用過程訪問。 (比較當您退出該過程時,如何在存儲過程中創建的臨時表消失)。但是,動態SQL塊可以訪問由調用過程創建的臨時表。

所以,你可以在你(字符串本身!在)執行字符串的存儲過程定義的臨時表(create table #outertemp (col1 INT Primary KEY ...)),或者您可以使用動態SQL中的全局臨時表。

+0

你可以給這個場景的任何例子 – Thiyagarajan

+1

更新我的答案,HTH。注意:我必須使用一次臨時表的動態創建,並且需要全局臨時表,因爲它們需要多個存儲過程。所有的工作都很成功,只要記住當你不再需要臨時表時,即在你存儲過程結束時刪除臨時表。 –

-1

您可以在執行字符串的存儲過程(不是字符串本身!)中定義臨時表create table #outertemp (col1 INT Primary KEY ...)),也可以在動態SQL中使用全局臨時表。

+0

你的鏈接(Perl for Oracle)與你的答案有什麼關係? – 2013-06-09 14:48:02