我在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。
任何帮助将非常感激。
如何处理一些真实的数据(你知道数据库中的一行,你知道失败)?表格模式也不错。 '将表达式转换为数据类型为int的算术溢出错误听起来像也许你有一个浮点数超过了允许的大int? –
只有当记录“很多”时才会失败。有了一个小项目,它不会给出任何错误。 –
一次删除一列,直到找到麻烦制造者。然后检查该列中的值以确定要处理的行的范围。为了处理定价,您可能需要使用更大范围的数据类型,例如数字。你可能想要使用COALESCE(MAX(Column),0)而不是铸造。 – HABO