SQL Server 2005中更新T-SQL时出错

时间:2010-12-23 09:29:42

标签: sql-server-2005

我想将EditEmail表中的一些数据从DBUsers数据库更新到DBCurrent datebase中的EditEmail表。所以当我执行以下语句时出错:

USE DBCurrent

UPDATE [DBUsers].[dbo].[EditEmail] EN
SET EN.MailSubject = E.MailSubject,
    EN.MailMessage = E.MailMessage
FROM
(
    SELECT * FROM EditEmail
) AS E
WHERE EN.Type = E.Type

错误讯息:

ERROR:
Msg 102, Level 15, State 1, Line 2
Incorrect syntax near 'EN'.
Msg 156, Level 15, State 1, Line 8
Incorrect syntax near the keyword 'AS'.

此T-SQL中是否存在语法错误?

2 个答案:

答案 0 :(得分:1)

您无法在UPDATE语句中为表格指定表格别名(无论出于何种原因 - 不要问我为什么这是不可能的,请咨询T-SQL设计团队)。

请尝试使用此声明:

USE DBCurrent

UPDATE 
    [DBUsers].[dbo].[EditEmail] 
SET 
    MailSubject = E.MailSubject,
    MailMessage = E.MailMessage
FROM
    dbo.EditEmail E
WHERE 
    DBUsers.dbo.EditEmail.Type = E.Type
    AND E.Type = 'blahblah'  -- or whatever additional conditions you have!

您需要指定要完整更新的表格,例如及其数据库,模式,表和列名称,在WHERE子句中。

你的“人工”子查询也不需要引用EditMail表 - 只需在FROM子句中定义它并给它一个表别名(这里,它们是支持的)

答案 1 :(得分:0)

T-SQL不允许在更新的表上定义别名, 但它允许更新别名:

这修复了语法,我认为逻辑仍然需要改进。 请尝试(我没有检查):

UPDATE EN
SET EN.MailSubject = E.MailSubject,
    EN.MailMessage = E.MailMessage
FROM [DBUsers].[dbo].[EditEmail] EN
    join EditEmail E
on EN.Type = E.Type