我已经在内存中声明了一个表。
DECLARE @T1 table(
a int,
b varchar(300),
c char(60)
)
现在,我需要使用@T1
和现有表IMMASTER
中的值。
SELECT @T1.*, IMMASTER.d
FROM @T1 JOIN IMMASTER
ON @T1.a = IMMASTER.a
该表存在于内存中,但显然无法使用@T1
动态引用其列。[列]-我得到:
Must declare the scalar variable "@T1".
在这种情况下,如何正确地从@T1
中检索列?
答案 0 :(得分:5)
您正在尝试从表变量中选择*,还应该为表添加别名,以作为其更好的形式:
SELECT T1.*, IMM.d
FROM @T1 as T1
JOIN IMMASTER as IMM
ON T1.a = IMM.a
答案 1 :(得分:0)
您已经声明了一个位于tempdb
中的表变量,该变量可能位于内存缓冲区中,但不要认为它没有使用tempdb
。 So the blanket statement that you created a table in memory is inaccurate。
使用表别名修复错误。
SELECT t.*, IMMASTER.d
FROM @T1 as t JOIN IMMASTER
ON t.a = IMMASTER.a
答案 2 :(得分:0)
您必须声明该表并同时对该表运行其他查询。
如果仅突出显示选择而不是声明,则将得到错误。
此外,如果在声明和查询之间的任何地方使用GO
,也会收到该错误。
如果必须将查询与声明分开,请使用#
临时表:
CREATE TABLE #T1
(a int,
b varchar(300),
c char(60))
请注意,@T1
中没有任何数据,在查询中您将需要一个别名-@T1.*
将引发错误。
答案 3 :(得分:-1)
您创建了表格,但未在其中填充任何数据。
您的JOIN约束ON @T1.a = IMMASTER.a
不能匹配任何记录,直到其中有记录为止。