当前位置: 代码迷 >> Sql Server >> SQL server2008中update语句出错4104
  详细解决方案

SQL server2008中update语句出错4104

热度:93   发布时间:2016-04-24 09:10:55.0
SQL server2008中update语句报错4104
代码如下:
update wy_dhmx set a.dhmx_cgdj=b.wzbm_jhdj from wy_dhmx a,wj_wzbm b where a.dh_id in(select dh_id from wy_dh where dh_tzrq>'2015-01-01 00:00:00.000') and a.dhmx_yssl<0 and a.dhmx_sssl<0 and a.dhmx_zjsl<0 and a.dhmx_cgdj<>b.wzbm_jhdj and a.wzbm_id=b.wzbm_id

报错如下:
消息 4104,级别 16,状态 1,第 1 行
无法绑定由多个部分组成的标识符 "a.dhmx_cgdj"。

求大神解释

------解决思路----------------------
因为 UPDATE 语句后面的表名是 wy_dhmx,所以要求 SET 后面的字段必须是属于 wy_dhmx 的。
建议被更新的目标表不加别名。
考虑自表更新时 wy_dhmx 可以在 FROM 中出现多次,哪个别名代表了更新的目标就不确定了。比如下面这样的语句
UPDATE wy_dhmx
   SET a.x = c.x,
       b.y = c.y
  FROM wy_dhmx a,
       wy_dhmx b,
       wj_wzbm c
...


------解决思路----------------------
“a. “ 感觉像 ”形参“,只能用不能改。大概是这个意思。

从语法上说
既然 ”UPDATE wy_dhmx“
那么 set 后面的必然是” wy_dhmx“的字段,所以不用再加其他标识符了
------解决思路----------------------

update wy_dhmx set a.dhmx_cgdj=b.wzbm_jhdj from wy_dhmx a
改成 
update a set a.dhmx_cgdj=b.wzbm_jhdj from wy_dhmx a

-- PS:没有2014,没测试 

------解决思路----------------------

update a set a.dhmx_cgdj=b.wzbm_jhdj from wy_dhmx a,wj_wzbm b where a.dh_id in(select dh_id from wy_dh where dh_tzrq>'2015-01-01 00:00:00.000') and a.dhmx_yssl<0 and a.dhmx_sssl<0 and a.dhmx_zjsl<0 and a.dhmx_cgdj<>b.wzbm_jhdj and a.wzbm_id=b.wzbm_id
  相关解决方案