从内存中的表中选择列

时间:2018-07-19 18:34:52

标签: sql sql-server tsql

我已经在内存中声明了一个表。

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中检索列?

4 个答案:

答案 0 :(得分:5)

您正在尝试从表变量中选择*,还应该为表添加别名,以作为其更好的形式:

SELECT T1.*, IMM.d 
FROM @T1 as T1 
JOIN IMMASTER  as IMM
ON T1.a = IMM.a

答案 1 :(得分:0)

您已经声明了一个位于tempdb中的表变量,该变量可能位于内存缓冲区中,但不要认为它没有使用tempdbSo 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不能匹配任何记录,直到其中有记录为止。