繁体   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