Sql-Server
如果 sp_ExecuteSql 創建一個新會話,我怎麼能訪問在動態 SQL 之外創建的(在執行之前)本地臨時表?
如果本地臨時表僅對目前會話可用,並且 sp_ExecuteSql 創建一個新會話來執行傳遞給它的動態 SQL 字元串,那麼該動態 SQL 查詢如何訪問在執行 sp_ExecuteSql 的會話中創建的臨時表。
換句話說,為什麼會這樣:
SELECT 1 AS TestColumn INTO #TestTempTable DECLARE @DS NVARCHAR(MAX) = 'SELECT * FROM #TestTempTable' EXEC sp_EXECUTESQL @DS
結果:
我之所以不能做相反的事情(在動態 SQL 中創建臨時表,然後在執行會話中的動態 SQL 查詢之外訪問它)的原因是因為 sp_ExecuteSql 在新會話下執行。
來自Remus Rusanu的回答:
動態 SQL 與呼叫程式碼在同一會話中執行。問題不是會話,而是范圍。您的動態 SQL 在 sp_executesql 呼叫中創建臨時表,因此創建的 #temp 表僅在該 sp_executesql 呼叫中可見,如 MSDN 中所述:
您可以通過執行以下命令來驗證您在
sp_executesql
通話中使用的是同一會話:DECLARE @DS NVARCHAR(MAX) = 'SELECT @@SPID' EXEC sp_EXECUTESQL @DS
知道
sp_executesql
在不同的範圍內執行但不是在不同的會話下執行,添加在臨時表的文件中找到的資訊:臨時表超出範圍時會自動刪除,除非使用 DROP TABLE 顯式刪除:
以及關於臨時表可見性的相同來源:
本地臨時表僅在目前會話中可見
這些範圍與會話的差異解釋了為什麼您可以通過
sp_executesql
呼叫訪問臨時表,但反過來卻不行。