Sql server 是否可以在不使用table variable或temp table的情况下创建contant表?

Sql server 是否可以在不使用table variable或temp table的情况下创建contant表?,sql-server,sql-server-2008,tsql,Sql Server,Sql Server 2008,Tsql,我有一个表a需要连接表B 表B是一个常数,包含两列 year, flag ---------- 2010, A1 2011, A2 2012, A3 2013, A4 2014, A5 是否可以执行以下操作(*sql server中的语法无效,请使用它来说明我的意思): 我不想为B使用表变量或临时表。还有其他选择吗 谢谢是的,您可以使用它在计划中创建文字值表 SELECT * FROM A RIGHT JOIN ( VALUES(2010, 'A1'),

我有一个表a需要连接表B

表B是一个常数,包含两列

year, flag
----------
2010, A1
2011, A2
2012, A3
2013, A4
2014, A5
是否可以执行以下操作(*sql server中的语法无效,请使用它来说明我的意思):

我不想为B使用表变量或临时表。还有其他选择吗

谢谢

是的,您可以使用它在计划中创建文字值表

SELECT *
FROM   A
       RIGHT JOIN ( VALUES(2010, 'A1'),
                          (2011, 'A2'),
                          (2012, 'A3'),
                          (2013, 'A4'),
                          (2014, 'A5') ) B(year, flag)
         ON A.year = B.year 

但是,此表没有索引,最多只能有1000行。

为什么不创建一个真正的表?为什么不想使用表变量或临时表呢?因为这是存储过程的一部分。我们需要将此查询再次连接到其他一些查询。如果sql server中存在类似的情况,那么我们可以编写一个查询,让sql对其进行优化。如果使用table变量,似乎会减慢速度。CTE(Comman table Expression)是您的朋友:)+1对于新信息,我不知道这一点。但是否存在必须这样做的特殊情况???这会起作用,但最好将其放在数据库中的真实表中,因此,在2015年,您可以添加一个值,所有使用该值的地方都将自动包含该值。这样,您就不必在代码中查找所有引用。这是在表中存储信息的目的之一。@MuhammedAli-它只是
UNION-ALL
的派生表的语法糖。例如,这些虚拟表不需要查询系统对象。交叉连接实表需要锁,这是lol
语法糖
,并为有趣的阅读欢呼:)一个不错的答案!也许您可以将其创建为视图,并根据需要重用它。
SELECT *
FROM   A
       RIGHT JOIN ( VALUES(2010, 'A1'),
                          (2011, 'A2'),
                          (2012, 'A3'),
                          (2013, 'A4'),
                          (2014, 'A5') ) B(year, flag)
         ON A.year = B.year