[英]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.