我不完全理解 Transact-SQL 中的“USE”陳述句以及它如何影響臨時表的范圍。我在一個資料庫中有一個用戶定義的表型別,但在另一個資料庫中沒有,我發現我需要“使用”該資料庫才能定義該型別的表。在查詢的前面,我定義了一個臨時表。在“USE”陳述句之后,SSMS 無法將臨時表識別為有效的物件名稱,但是我仍然可以從中查詢而不會出錯。
我的 SQL 查詢的骨架如下:
USE MYDATABASE1
[...一堆我沒有寫的代碼...]
SELECT * INTO #TEMP_TABLE FROM #SOME_EARLIER_TEMP_TABLE
USE MYDATABASE2
DECLARE @MYTABLE MyUserDefinedTableType -- this table type only exists in MYDATABASE2
INSERT INTO @MYTABLE(Col1, Col2)
SELECT Col1, Col2 FROM (SELECT * FROM MYDATABASE2.dbo.SOME_TABLE_VALUED_FUNCTION(param1, param2)) T
SELECT A.*, B.Col2
FROM #TEMP_TABLE A
CROSS APPLY DATABASE2.dbo.SOME_OTHER_TABLE_VALUED_FUNCTION(@MYTABLE, A.SomeColumn) B
在最后一個 SELECT 陳述句中,SSMS 在“A.*”和“#TEMP_TABLE”下有紅色波浪線,但是運行查詢沒有錯誤。
所以我的問題是:即使我的查詢仍然有效,我是否在做“錯誤”的事情?假設初始的“USE MYDATABASE1”是必要的,那么切換資料庫的正確方法是什么,同時仍然讓#TEMP_TABLE 作為有效的物件名稱可用?(請注意,將#TEMP_TABLE 的定義移至“USE MYDATABASE2”之后只會將問題轉移到#SOME_EARLIER_TEMP_TABLE。)
uj5u.com熱心網友回復:
在 SQL 中,USE基本上告訴查詢哪個資料庫是“默認”資料庫。
臨時表可以在智能感知上耍花招——除非它們是使用CREATE TABLE #MyTempTable路由明確定義的,否則智能感知在很多時候并不真正知道如何處理它們。不過不用擔心 - 臨時表的范圍僅限于查詢。
雖然我覺得值得指出:雖然 UDT 是特定于資料庫的,但您可以創建一個程式集以跨資料庫使用
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/382455.html
標籤:sql sql-server
下一篇:用前導零填充列中的單個數字
