SQL Server:内部联接中使用的表变量

时间:2010-02-03 03:46:54

标签: sql sql-server

以下SQL有什么问题。 可以在JOIN子句中使用表变量吗?

错误消息是“消息170,级别15,状态1,行8行8:'t1'附近的语法不正确。”

Declare @t TABLE (
    _SportName  varchar(50),
    _Lang       varchar(3)
)

insert @t VALUES('Basketball', 'ENG') -- ENG

UPDATE tblSport t1 
SET 
    t1.SportName = @t._SportName
FROM 
    @t INNER JOIN tblSport ON (t1.Lang = @t._Lang)

感谢。

5 个答案:

答案 0 :(得分:17)

将您的上一个陈述更改为:

UPDATE t1, temp
SET t1.SportName = temp._SportName
FROM tblSport AS t1
INNER JOIN @t AS temp
    ON t1.Lang = temp._Lang

(需要检查确切的语法)

答案 1 :(得分:13)

除了t1别名在错误的地方之外,没有人提到在表变量周围使用方括号而不是别名。将update语句更改为以下内容也适用:

UPDATE t1
SET
    t1.SportName = [@t]._SportName
FROM
    @t INNER JOIN tblSport t1 ON t1.Lang = [@t]._Lang

[在SQL Server 2005上测试。]

答案 2 :(得分:9)

Justin的答案在语法上是正确的 - 您需要为临时表分配一个别名(2008年的表类型变量也是如此)。

但是,请注意,表变量和表类型变量都没有与之关联的任何统计信息,因此可能导致查询优化器对执行计划做出非常可疑的选择(因为它总是会估计表变量包含1行 - 因此通常选择嵌套循环作为连接运算符。

答案 3 :(得分:3)

您的别名t1位于错误的地方

UPDATE
    t1 
SET 
    SportName = @t._SportName
FROM 
    @t INNER JOIN tblSport t1 ON (t1.Lang = @t._Lang)

答案 4 :(得分:2)

不要忘记对变量表使用alias

Declare @t TABLE (
    _SportName  varchar(50),
    _Lang       varchar(3)
)

insert @t VALUES('Basketball', 'ENG') -- ENG

UPDATE t1 
SET 
    t1.SportName = t2._SportName
FROM tblSport t1 INNER JOIN
    @t as t2  ON (t1.Lang = t2._Lang)