我的任務是調試我們的一些舊代碼,並且遇到了一個問題。代碼是用VB6編寫的,我們有一個叫做RoundIt()
的函數,它接受一個值,然後將其舍入到2個小數位。令人驚訝的是,函數(並且我沒有太多的VB6經驗,所以我假設它可能只是語言的一個限制)構建一個SQL字符串來執行以便將值舍入。SQL ROUND - 算術溢出的真正原因是什麼?
所以在代碼中我們有一個雙重類型的變量,我將其稱爲myVal
。在這個特定的情況下,我們得到的是否是錯誤的,因爲myVal
值爲0.997721736173984
,建成串變得
SELECT ROUND(0.997721736173984, 2) as RoundedNum
,這導致在該消息中「算術溢出錯誤將表達式轉換爲數據類型數值」。根據我的理解,這是由於試圖將值四捨五入爲1但無法這樣做,因爲現在返回的數據類型與ROUND函數中輸入的數據類型不同,並且這些數據類型必須相同。
我的問題是,由於這是一個動態構建的SQL字符串,它不像我們正在聲明一個帶有數據類型的SQL變量並在ROUND函數中使用它,我們只是構建字符串 - 所以究竟是什麼默認數據類型爲0.997721736173984
?那麼什麼是試圖返回的數據類型是什麼?我猜測一個小數(不確定的精度或比例),並且當它試圖返回四捨五入的值時,精度或比例現在是不同的,但我只想確定。
我不是要求避免算術溢出,或確定不同的服務器上的差異,所以這個問題不是重複的建議。我的問題是什麼數據類型是從動態構建的SQL字符串輸入/輸出的,爲什麼會導致算術溢出錯誤(如果根據下面的註釋,它們具有相同的數據類型)。
你確定它是'MS SQL Server'嗎? 'ROUND'需要2個參數。 – lad2025
我的錯誤,我忘了添加該部分,更新問題。 – Goose
什麼版本的SQL服務器?當我將代碼投入到SQL 2012中時,它不會運行。也就是說,我的想法是,SQL Server期望類似於數字(x,y),並且總數位數大於x。 – CodeMonkey1313