2014-01-21 30 views
3

我在SQL Server中遇到问题我一直试图调试相当一段时间,我无法弄清楚问题出在哪里。SQL Server 2008将表达式转换为数据类型的算术溢出错误int

如果我运行此查询...

SELECT 
    CAST(Hotel_Id AS bigint) AS Hotel_Id, 
    Hotel_Name, 
    CAST(Room_Category AS bigint) AS Room_Category, 
    Room_Category_Name, 
    CAST(Room_Type AS bigint) AS Room_Type, 
    Room_Type_Name, 
    Info_URL_Title, 
    Info_URL , 
    MAX(CAST(ISNULL(Price_Excl_VAT, 0) AS bigint)) AS Price_Excl_VAT, 
    CASE 
     WHEN MAX(CAST(ISNULL(Price_Excl_VAT, 0) AS bigint)) = 0 
     THEN 0 ELSE MAX(CAST(ISNULL(Price, 0) AS bigint)) - MAX(CAST(ISNULL(Price_Excl_VAT, 0) AS bigint)) 
    END AS VAT, 
    MAX(CAST(ISNULL(Price, 0) AS bigint)) AS Price, 
    MAX(CAST(ISNULL(Dep_Amount, 0) AS [bigint])) AS Dep_Amount 
FROM 
    uvw_HotelAllotmentToBook 
WHERE Client_Id = 'CLIENT' AND Project_Id = 'PROJECT' 
    AND Allotment_Date >= '2014-05-11' AND Allotment_Date < '2014-05-14' 
GROUP BY Hotel_Id, Hotel_Name, Room_Category, Room_Category_Name, Room_Type, Room_Type_Name, Info_URL_Title, Info_URL, Dep_Amount 
HAVING COUNT(Allotment_Date) >= 3 

例如,在一个项目中,我们有一点超过4000条记录它不断给我这个错误

Msg 8115, Level 16, State 2, Line 1 
Arithmetic overflow error converting expression to data type int. 

我一直在谷歌上搜索周围,但找不到解决这个问题的方法,我尝试了,因为你可以看到将所有数字字段铸造成大诠释没有运气。

我需要找到最高的价格,因为每晚的价格可以改变。

UPDATE

SELECT Hotel_Id 
    ,Hotel_Name 
    ,Room_Category AS Room_Category 
    ,Room_Category_Name 
    ,Room_Type AS Room_Type 
    ,Room_Type_Name 
    ,Info_URL_Title 
    ,Info_URL 
    ,COUNT(Allotment_Date) 
    ,MAX(CAST(ISNULL(Price_Excl_VAT, 0) AS BIGINT)) AS Price_Excl_VAT 
    ,CASE WHEN MAX(CAST(ISNULL(Price_Excl_VAT, 0) AS BIGINT)) = 0 THEN 0 
     ELSE MAX(CAST(ISNULL(Price, 0) AS BIGINT)) - MAX(CAST(ISNULL(Price_Excl_VAT, 0) AS BIGINT)) 
    END AS VAT 
    ,MAX(CAST(ISNULL(Price, 0) AS BIGINT)) AS Price 
    ,MAX(CAST(ISNULL(Dep_Amount, 0) AS BIGINT)) AS Dep_Amount 
FROM uvw_HotelAllotmentToBook 
WHERE Client_Id = 'PCWHK' 
    AND Project_Id = 'INTA14' 
    AND Allotment_Date >= '2014-05-11' 
    AND Allotment_Date < '2014-05-14' 
GROUP BY Hotel_Id 
    ,Hotel_Name 
    ,Room_Category 
    ,Room_Category_Name 
    ,Room_Type 
    ,Room_Type_Name 
    ,Info_URL_Title 
    ,Info_URL 
    --,Dep_Amount 
HAVING COUNT(Allotment_Date) >= 3 

我继续得到同样的溢出错误,但现在我注释掉该行

,MAX(CAST(ISNULL(Dep_Amount, 0) AS BIGINT)) AS Dep_Amount 

的错误消失。

问题是我需要结果中的Dep_Amount。

任何帮助将非常感激。

+0

如何处理一些真实的数据(你知道数据库中的一行,你知道失败)?表格模式也不错。 '将表达式转换为数据类型为int的算术溢出错误听起来像也许你有一个浮点数超过了允许的大int? –

+0

只有当记录“很多”时才会失败。有了一个小项目,它不会给出任何错误。 –

+0

一次删除一列,直到找到麻烦制造者。然后检查该列中的值以确定要处理的行的范围。为了处理定价,您可能需要使用更大范围的数据类型,例如数字。你可能想要使用COALESCE(MAX(Column),0)而不是铸造。 – HABO

回答

2

发现问题!

问题出在视图中。

在此行中它被生成Dep_Amount列

CASE 
WHEN COALESCE(hap.Charge_Dep_Amount, 0) = 0 
THEN COALESCE(hap.Dep_Amount, 0) 
ELSE (COALESCE(CAST(hap.Dep_Amount AS numeric), 0) * COALESCE(CAST(hap.Price AS numeric), 0))/10000 
END AS Dep_Amount, 

如今,我将铸造否则为数字的错误消失! :)

0

您不需要投射仅在没有对其执行任何操作的情况下返回的列。我会按照以下方式运行查询,并在当时只取消注释一行来查明问题出在哪里。很有可能是最后一行HAVING COUNT(是什么中断

SELECT Hotel_IdAS Hotel_Id 
    ,Hotel_Name 
    ,Room_Category AS Room_Category 
    ,Room_Category_Name 
    ,Room_Type AS Room_Type 
    ,Room_Type_Name 
    ,Info_URL_Title 
    ,Info_URL 
    ,COUNT(Allotment_Date) 
    --,MAX(CAST(ISNULL(Price_Excl_VAT, 0) AS BIGINT)) AS Price_Excl_VAT 
    --,CASE WHEN MAX(CAST(ISNULL(Price_Excl_VAT, 0) AS BIGINT)) = 0 THEN 0 
    --  ELSE MAX(CAST(ISNULL(Price, 0) AS BIGINT)) - MAX(CAST(ISNULL(Price_Excl_VAT, 0) AS BIGINT)) 
    -- END AS VAT 
    --,MAX(CAST(ISNULL(Price, 0) AS BIGINT)) AS Price 
    --,MAX(CAST(ISNULL(Dep_Amount, 0) AS [bigint])) AS Dep_Amount 
FROM uvw_HotelAllotmentToBook 
WHERE Client_Id = 'CLIENT' 
    AND Project_Id = 'PROJECT' 
    AND Allotment_Date >= '2014-05-11' 
    AND Allotment_Date < '2014-05-14' 
GROUP BY Hotel_Id 
    ,Hotel_Name 
    ,Room_Category 
    ,Room_Category_Name 
    ,Room_Type 
    ,Room_Type_Name 
    ,Info_URL_Title 
    ,Info_URL 
    ,Dep_Amount 
--HAVING COUNT(Allotment_Date) >= 3 
+0

OP表中有4000条记录,所以'COUNT()'不应该导致溢出。 –

+0

我粘贴完全按照你在这里发布的查询,仍然给我同样的错误。如果我只注释掉这一行,MAX(CAST(ISNULL(Dep_Amount,0)AS [bigint]))AS Dep_Amount它可以工作,当我从该行删除注释时,我开始得到相同的错误。 –

+0

所以它适用于该行,但没有它就无法工作? – 2014-01-21 19:25:19

相关问题