以下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)
感谢。
答案 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)