可能重复:
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”。
任何帮助将不胜感激。
答案 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所说,不可能更新多个表。 无论如何,如果你的环境允许它,你可以走路程序。 这是安全和原子的。请记住,在捕获错误时,始终回滚。