在 SQL Server 中使用表变量

4

我为表变量设计了一个小查询。以下是代码:

DECLARE @TESTTABLE TABLE (ID INT, NAME VARCHAR(40))

INSERT INTO @TESTTABLE 
VALUES (1, 'WALLEY'), (2, 'BARRY'), (3, 'TIM'),
       (4, 'DICK'), (5, 'BRUCE')

我有一个问题,SQL允许在表变量中使用别名,就像下面的查询一样。

SELECT * 
FROM @TESTTABLE t 
INNER JOIN EMPLOYEE_DETAILS ON t.ID = BusinessEntityID

但是你不能像下面这样使用实际的表变量名:
SELECT * 
FROM @TESTTABLE 
INNER JOIN EMPLOYEE_DETAILS ON @TESTTABLE.ID = BusinessEntityID

上述查询出现了错误。
有人有解决方案吗?非常有帮助。

1
你使用的是哪种数据库管理系统? - Error_2646
1
当您运行代码时,您看到了什么错误?本能地建议您使用别名并查看是否有所帮助,例如 SELECT * FROM @TESTTABLE tt INNER JOIN EMPLOYEE_DETAILS emp_d ON tt.ID = emp_d.BusinessEntityID - Dessma
你好,你的问题不是很清楚。除了包括DBMS和错误信息的细节外,你能否澄清你实际想知道什么?你似乎已经知道一种使查询工作的方法(使用别名)。你是在寻找更简短的方式吗?还是你只是想了解为什么它不起作用? - IMSoP
无论如何,我认为大多数情况下数据库对象(如表)必须是静态的。因此,如果您想要参数化,则需要使用动态SQL。 - Error_2646
@Error_2646 这不是一个参数化查询,变量不仅仅保存表名,它就是表;本质上是一种不同类型的临时表。 - IMSoP
显示剩余3条评论
2个回答

5

在 T-SQL 中,当连接变量表时需要使用别名。

参考资料:https://odetocode.com/articles/365.aspx(请参阅“限制”部分)

这应该会给你类似于这样的东西:

SELECT * 
FROM @TESTTABLE tt 
INNER JOIN EMPLOYEE_DETAILS emp_d 
ON tt.ID = emp_d.BusinessEntityID

这似乎不是真的。你有微软的参考资料吗? - RBarryYoung
2
在FROM子句之外,必须使用别名引用表变量。 - Gareth Lyons
从原始帖子中我所了解的情况是,它可以在FROM子句中工作,但不能在JOIN / ON子句中使用。这也是文档所建议的。不过我目前无法进行测试。 - Dessma
@RBarryYoung,它在ON子句中,而不是FROM子句中。MS页面上的示例是连接的示例。您的解决方案也可以,尽管老实说,我很惊讶它能够工作!我以前从未见过在mssql中引用表变量的方式。 - Gareth Lyons
@GarethLyons ONFROM 子句的一部分,它不是 "FROM 子句之外的". - RBarryYoung
显示剩余3条评论

2
使用 "[..]" 引用表变量的名称。这对我很有效:
SELECT * 
FROM @TESTTABLE INNER JOIN 
     EMPLOYEE_DETAILS
     ON [@TESTTABLE].ID = BusinessEntityID

话虽如此,我可能更喜欢使用别名,或者只使用CTE而放弃表变量。


谢谢回复。但是这个不起作用。我收到以下错误消息。 无法绑定多部分标识符“@TESTTABLE.ID”。 - Tushal Singh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接