Sql-Server

如果 sp_ExecuteSql 創建一個新會話,我怎麼能訪問在動態 SQL 之外創建的(在執行之前)本地臨時表?

  • December 9, 2019

如果本地臨時表僅對目前會話可用,並且 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 中創建臨時表,然後在執行會話中的動態 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呼叫訪問臨時表,但反過來卻不行。

引用自:https://dba.stackexchange.com/questions/255202