2011-09-02 70 views
0

可能重复:
How to update two tables in one statement in SQL Server 2005?更新2表中的一个声明(MS SQL)

我有一个更新语句。它更新另一个表上的一个字段,但内部联接以完成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_calendardateboxtbl_calendarobjects。我在tbl_calendarobjects.Saved ='0' - 上收到错误消息无法绑定多部分标识符“tbl_calendarobjects.Saved”。

任何帮助将不胜感激。

+1

你给表的别名,但不使用它们。当你在这里发布信息时你或者破坏了某些东西,或者你从来没有得到systax的工作。我也不确定是否可以在一个声明中更新多个表格,但这是我至少能够立即发现的一件事。 –

+0

我给集合上的完全限定的别名,因为它不会从中获取别名。 – tmutton

+0

看到我的答案,我已经做出了这样的疑问,所以我经常失去数。然而,从来没有尝试更新多个表,可以立即工作,但...不知道。 –

回答

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 

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

这是不可能的可悲。

+0

谢谢,但它仍然与o.Saved错误=多部分标识符“ o.Saved“无法被绑定 – tmutton

+0

您可能无法在尝试执行多个表时尝试使用from子句进行更新,请尝试对Marco建议的内容进行修改。 –

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 
+0

感谢Marco,虽然它在这里抛出语法错误。它首先在cdb'Expecting SET'上抛出一个错误,这让我相信你在SET之前不能内连接。 – tmutton

+1

我个人认为它与USING有关系,我个人不知道USING语句(尽管这并不意味着太多!)。请注意,我知道使用dbname指定要运行查询的数据库,但在加入时我不知道它。我在我的帖子中编辑了一个宏的答案变体,使用了一个“正常”的声明。 –

+0

这是MySQL吗?我忘了提及,我正在使用MS SQL。 – tmutton

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 
} 
0

就像Shantanu所说的那样,不可能更新多个表格。 无论如何,如果你的环境允许,你可以走程序路线。 它是安全的和原子的。请记住,在发现错误时,总是回滚。