SQL Server更新查询中的语法不正确

时间:2018-12-28 02:51:19

标签: sql-server

以下更新查询中出了什么问题。错误消息是

  

“ SD”附近的语法不正确。

代码:

UPDATE T_EmpSelf_Details SD, T_TravelDetails TD 
SET SD.Host_Country = TD.New_Host_Country 
WHERE 
    SD.EL_Year = TD.EL_Year 
    AND SD.Emp_ID = TD.EmpId 
    AND SD.Staff_number IN ('00002080', '00002320');

4 个答案:

答案 0 :(得分:1)

没有理由使事情变得过于复杂...不需要CTE,派生表或子查询...

UPDATE SD SET
    SD.Host_Country = TD.New_Host_Country
FROM
    T_EmpSelf_Details SD
    JOIN T_TravelDetails TD
        ON SD.EL_Year = TD.EL_Year
        AND SD.Emp_ID = TD.EmpId
WHERE
    SD.Staff_number IN ('00002080', '00002320');

此语法还有一个额外的好处,即允许您将查询写为SELECT,验证谓词正确,然后轻松将其转换为UPDATE ...

/* begin by writing it as a SELECT... */
SELECT 
    SD.Host_Country, 
    TD.New_Host_Country
FROM
    T_EmpSelf_Details SD
    JOIN T_TravelDetails TD
        ON SD.EL_Year = TD.EL_Year
        AND SD.Emp_ID = TD.EmpId
WHERE
    SD.Staff_number IN ('00002080', '00002320');


/* when you're satisfied that the correct rows & values are in scope. convet it to an UPDATE...
-- begin by writing it as a SELECT... */

--SELECT 
--  SD.Host_Country, 
--  TD.New_Host_Country
UPDATE SD SET
    SD.Host_Country = TD.New_Host_Country
FROM
    T_EmpSelf_Details SD
    JOIN T_TravelDetails TD
        ON SD.EL_Year = TD.EL_Year
        AND SD.Emp_ID = TD.EmpId
WHERE
    SD.Staff_number IN ('00002080', '00002320'); 

答案 1 :(得分:0)

尝试使用通用表表达式代替:

WITH cte
AS (
    SELECT
        SD.Host_Country
      , TD.New_Host_Country
    FROM T_EmpSelf_Details SD
    INNER JOIN T_TravelDetails TD ON SD.EL_Year = TD.EL_Year
        AND SD.Emp_ID = TD.EmpId
    WHERE SD.Staff_number IN ('00002080', '00002320')
)
UPDATE cte
SET Host_Country = New_Host_Country
;

请注意,在25年前,ANSI标准对联接语法进行了形式化。尝试采用这种语法,首先要避免在from子句中的表名之间使用逗号。

更新语句的另一种方法如下:

UPDATE SD
SET SD.Host_Country = TD.New_Host_Country
FROM T_EmpSelf_Details SD
INNER JOIN T_TravelDetails TD
    ON SD.EL_Year = TD.EL_Year
    AND SD.Emp_ID = TD.EmpId
WHERE SD.Staff_number IN ('00002080', '00002320');

答案 2 :(得分:0)

在SQL中,使用“更新查询”一次只能更新一个表,因此在UPDATESET关键字之间只能指定一个表名。

但是在代码中,您指定了2个表(即使仅更新一个表)。

如此恢复状态,可以使用像这样的简单内部联接来实现

UPDATE SD -- Name/Alias of the Table to be updated 
    SET
        Host_Country=TD.New_Host_Country 
    FROM T_EmpSelf_Details SD
        INNER JOIN T_TravelDetails TD 
            ON SD.EL_Year=TD.EL_Year 
        WHERE  SD.Emp_ID=TD.EmpId 
            AND SD.Staff_number in ('00002080','00002320');

答案 3 :(得分:-1)

@Alex Kudryashev正确指出了该错误,该错误试图一次更新2个表。更正的SQL:

UPDATE
      T_EmpSelf_Details SD
      INNER JOIN T_TravelDetails TD ON (
        SD.EL_Year = TD.EL_Year
        and SD.Emp_ID = TD.EmpId
      )
    SET
      SD.Host_Country = TD.New_Host_Country
    where
      SD.Staff_number IN ('00002080', '00002320');

查询在https://www.eversql.com/sql-syntax-check-validator/处得到验证