簡體   English   中英

SQL:“USE”語句后的臨時表“無效的 object 名稱”

[英]SQL: temp table "invalid object name" after "USE" statement

我不完全理解 Transact-SQL 中的“USE”語句以及它如何影響臨時表的 scope。 我在一個數據庫中有一個用戶定義的表類型,但在另一個數據庫中沒有,我發現我需要“使用”該數據庫才能定義該類型的表。 在查詢的前面,我定義了一個臨時表。 在“USE”語句之后,SSMS 不會將臨時表識別為有效的 object 名稱,但是我仍然可以從中查詢而不會出錯。

我的 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 用作有效的 object 名稱的同時切換數據庫的正確方法是什么? (請注意,將#TEMP_TABLE 的定義移到“USE MYDATABASE2”之后只會將問題轉移到#SOME_EARLIER_TEMP_TABLE。)

在 SQL 中, USE基本上告訴查詢哪個數據庫是“默認”數據庫。

臨時表可以在智能感知上發揮作用——除非它們是使用CREATE TABLE #MyTempTable路由明確定義的,否則智能感知在很多時候並不真正知道如何處理它們。 不過不用擔心 - 臨時表的范圍僅限於查詢。

盡管我確實覺得值得指出:雖然 UDT 是特定於數據庫的,但您可以創建一個程序集以跨數據庫使用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM