当我使用订单时“遇到零除错误”。

时间:2014-07-08 06:31:40

标签: sql sql-server

我有以下SQL查询,如果我删除顺序的最后一行,它是有效的。 任何人都可以告诉我,为什么当我在这个查询上下订单时这不起作用。

declare @UQ as decimal(20,6); 
declare @MUQ as decimal(20,6); 

select @UQ=ItemUnit_UnitQuantity, @MUQ=ItemUnit_MainUnitQuantity from tItemUnit 
where ItemUnit_Id = 23996
select top 1 (InvBuyPriceValue/InvL_Quantity)*iu.ItemUnit_UnitQuantity/iu.ItemUnit_MainUnitQuantity*@MUQ/@UQ  as InvBuyPrice, Discount
from tInvL l 
left outer join tInvH h on h.InvH_Id = l.InvH_Id 
left outer join tItem i on i.Item_Id = l.Item_Id 
left outer join tItemUnit iu on iu.ItemUnit_Id = l.ItemUnit_Id 
left outer join tUnit u on u.Unit_Id = iu.Unit_Id
left outer join tClientObj clo on clo.ClientObj_Id = h.ClientObj_Id 
left outer join tDocType dt on dt.DocType_Id = h.DocType_Id 
where h.CompanyObj_Id = (select CompanyObj_Id from tEnabledCompany where CompanyClientObj_Id=(select ClientObj_Id from tClientObj where ClientObj_Code = '504'))
and dt.DocType_InOut = 1
and l.Item_Id = 19558
and h.ClientObj_Id = 386
order by InvH_DocDate desc, InvH_DocTime desc

我收到错误说: 遇到零错误。

我不明白为什么我在订购时会收到此错误,而不是在例如select语句中...

2 个答案:

答案 0 :(得分:1)

中有分歧
select top 1 (InvBuyPriceValue/InvL_Quantity)*iu.ItemUnit_UnitQuantity/iu.ItemUnit_MainUnitQuantity*@MUQ/@UQ

所以可能InvL_Quantity或iu.ItemUnit_MainUnitQuantity为零。

为什么不在没有ORDER BY的情况下看到SQL Server错误?您只是请求TOP 1行,因此SQL Server不需要遍历所有行并计算结果。出于性能原因,SQL Server只选择TOP 1行,计算结果并返回它。

你得到的是TOP 1除以零而不是偶然。如果你没有TOP 1并且你没有ORDER BY,你肯定会看到同样的错误。

答案 1 :(得分:0)

SELECT TOP 1
    (InvBuyPriceValue / InvL_Quantity) * 
     iu.ItemUnit_UnitQuantity / iu.ItemUnit_MainUnitQuantity * 
     @MUQ / @UQ AS InvBuyPrice,

这是你执行分裂的唯一地方。 InvL_QuantityItemUnit_MainUnitQuantity列可能包含零值。

同时检查ItemUnit_UnitQuantity,这是分配给@UQ的值,也是一个除数。