在一个语句中更新2个表(MS SQL)

时间:2011-09-02 09:44:47

标签: sql sql-update inner-join

  

可能重复:
  How to update two tables in one statement in SQL Server 2005?

我有更新声明。它更新一个字段,但在另一个表上进行内部连接以完成where子句。我正在使用MS SQL。

我现在正在尝试更新已连接表上的字段但似乎无法执行此操作。我已经读过你一次只能更新一个表。这是真的?有没有办法解决这个问题?

这是我的陈述

update tbl_calendardatebox
set 
tbl_calendardatebox.HeaderBgColour = @value,
tbl_calendarobjects.Saved = '0'

from tbl_calendardatebox db
inner join tbl_calendarobjects o on
db.ObjectId = o.Id

where o.PageId = @page
and o.GroupField = @group and o.GroupField <> '-1'
and o.Visible = '1'
and o.CanUserEdit = '1'
and db.HeaderBgColour <> @value

因此,这两个表格是 tbl_calendardatebox tbl_calendarobjects 。我在tbl_calendarobjects.Saved ='0' - 上收到错误消息无法绑定多部分标识符“tbl_calendarobjects.Saved”。

任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:3)

无法同时更新多个表。以下是来自MSDN的摘要,其中清楚地显示了

{}表示必填字段

[]表示可选字段

[... n]代表0或更多

<强> See this

UPDATE 
        { 
         table_name WITH ( < table_hint_limited > [ ...n ] ) 
         | view_name 
         | rowset_function_limited 
        } 
        SET 
        { column_name = { expression | DEFAULT | NULL } 
        | @variable = expression 
        | @variable = column = expression } [ ,...n ] 

    { { [ FROM { < table_source > } [ ,...n ] ] 

        [ WHERE 
            < search_condition > ] } 
        | 
        [ WHERE CURRENT OF 
        { { [ GLOBAL ] cursor_name } | cursor_variable_name } 
        ] } 
        [ OPTION ( < query_hint > [ ,...n ] ) ] 

以下部分不能包含任何连接。 “{}”表示必须包含视图名称或表名但不包含连接的字段。

{ 
 table_name WITH ( < table_hint_limited > [ ...n ] ) 
 | view_name 
 | rowset_function_limited 
} 

答案 1 :(得分:2)

语法修复开始,也可以解决问题,未经测试!

update db
set 
db.HeaderBgColour = @value,
o.Saved = '0'

from tbl_calendardatebox db
inner join tbl_calendarobjects o on
db.ObjectId = o.Id

where o.PageId = @page
and o.GroupField = @group and o.GroupField <> '-1'
and o.Visible = '1'
and o.CanUserEdit = '1'
and db.HeaderBgColour <> @value

在stackoverflow上找到实际答案:How to update two tables in one statement in SQL Server 2005?

这不可能遗憾。

答案 2 :(得分:1)

希望这个例子(取自here)可以帮助你:

UPDATE a 
INNER JOIN b USING (id) 
SET a.firstname='Pekka', a.lastname='Kuronen', 
b.companyname='Suomi Oy',companyaddress='Mannerheimtie 123, Helsinki Suomi' 
WHERE a.id=1; 

您查询(我无法测试,抱歉)可能是:

UPDATE tbl_calendardatebox cdb
  INNER JOIN tbl_calendarobjects co
    ON cdb.ObjectId = co.Id
SET cdb.HeaderBgColour = @value
  , co.Saved = '0'
WHERE co.PageId = @page
AND co.GroupField = @group 
AND co.GroupField <> '-1'
AND co.Visible = '1'
AND co.CanUserEdit = '1'
AND cdb.HeaderBgColour <> @value

答案 3 :(得分:0)

像Shantanu所说,不可能更新多个表。 无论如何,如果你的环境允许它,你可以走路程序。 这是安全和原子的。请记住,在捕获错误时,始终回滚。