错误的SQL脚本,错误消息 4104
今天要做个报表,其中用到了UPDATE 的多表更新,通常这种更新的语法我是很熟练的,但今天写好后查询分析器检查时总是提示错误:
消息 4104,级别 16,状态 1,第 1 行
The multi-part identifier "S.RetailQty" could not be bound.
我的脚本如下:
经多方查询无果后,我只有自己用一个最简单的DEMO来测试我得这个更新语法结果发现了问题。
我的DEMO的代码如下:
结果这个DEMO执行正常,在仔细比较两个更新语句发现问题处在对表使用别名上。在DEMO中我Update 后跟的表名是#a 的别名a,而我正式脚本中的Update后跟的是表名,而不是别名。后来又把这个临时表改为正式表,也是这样。这说明在一个SQL语句中如果定义了表的别名就必须使用别名,而不能再继续使用表名。否则就会出错。
洪虎
2006-10-19
消息 4104,级别 16,状态 1,第 1 行
The multi-part identifier "S.RetailQty" could not be bound.
我的脚本如下:
update #StorageDetail set S.RetailQty = R.Qty, S.Amount = R.Amount
from #StorageDetail S inner join #RetailBill R
on (S.ShopId = R.ShopId)
and S.prodid = R.prodid
and S.color = R.color
and S.Size = R.Size
from #StorageDetail S inner join #RetailBill R
on (S.ShopId = R.ShopId)
and S.prodid = R.prodid
and S.color = R.color
and S.Size = R.Size
经多方查询无果后,我只有自己用一个最简单的DEMO来测试我得这个更新语法结果发现了问题。
我的DEMO的代码如下:
create table #A (a char(10), b char(10),qty int)
insert into #A(a,b,qty) values('A01','0',10)
insert into #A(a,b,qty) values('A02','0',9)
insert into #A(a,b,qty) values('A02','0',9)
insert into #A(a,b,qty) values('A03','0',8)
insert into #A(a,b,qty) values('A04','0',7)
create table #B (a char(10), b char(10),qty int)
insert into #B(a,b,qty) values('A01','0',1)
insert into #B(a,b,qty) values('A02','0',2)
insert into #B(a,b,qty) values('A03','0',3)
insert into #B(a,b,qty) values('A03','0',8)
insert into #B(a,b,qty) values('A04','0',4)
alter table #a add qty2 int
update a set a.qty2 = b.qty from #a a inner join #b b
on a.a = b.a and a.b = b.b
select * from #a
select * from #b
drop table #a
drop table #b
insert into #A(a,b,qty) values('A01','0',10)
insert into #A(a,b,qty) values('A02','0',9)
insert into #A(a,b,qty) values('A02','0',9)
insert into #A(a,b,qty) values('A03','0',8)
insert into #A(a,b,qty) values('A04','0',7)
create table #B (a char(10), b char(10),qty int)
insert into #B(a,b,qty) values('A01','0',1)
insert into #B(a,b,qty) values('A02','0',2)
insert into #B(a,b,qty) values('A03','0',3)
insert into #B(a,b,qty) values('A03','0',8)
insert into #B(a,b,qty) values('A04','0',4)
alter table #a add qty2 int
update a set a.qty2 = b.qty from #a a inner join #b b
on a.a = b.a and a.b = b.b
select * from #a
select * from #b
drop table #a
drop table #b
结果这个DEMO执行正常,在仔细比较两个更新语句发现问题处在对表使用别名上。在DEMO中我Update 后跟的表名是#a 的别名a,而我正式脚本中的Update后跟的是表名,而不是别名。后来又把这个临时表改为正式表,也是这样。这说明在一个SQL语句中如果定义了表的别名就必须使用别名,而不能再继续使用表名。否则就会出错。
洪虎
2006-10-19