web-dev-qa-db-ja.com

SQL Server2008式をデータ型intに変換する算術オーバーフローエラー

かなり長い間デバッグしようとしていたSQLServerに問題があり、問題がどこにあるのかわかりません。

このクエリを実行すると…

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.

私はグーグルで探し回っていますが、これを修正する方法が見つかりません。運が悪かったので、すべての数値フィールドを大きな整数にキャストしているのを見ることができるので、試しました。

1泊あたりの料金は変わる可能性があるため、料金の最大値を見つける必要があります。

更新

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が必要なことです。

どんな助けでも大歓迎です。

3
Federico Giust

問題が見つかりました!

問題は視野にあった。

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, 

Elseを数値としてキャストしているので、エラーはなくなりました!!! :)

3
Federico Giust

操作を実行せずに返されたばかりの列をキャストする必要はありません。次の方法でクエリを実行し、一度に1行ずつコメントを外して、問題の場所を特定します。非常に最後の行が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
user275683