根據MSDN,REAL值的範圍是 - 3.40E + 38到-1.18E-38,0和1.18E -38到3.40E + 38.但是,我有一個相當我的表中超出這個範圍的數值很少。REAL列保持值超出記錄範圍
下面的查詢返回大量的非常小的值,並沒有非常大的:
SELECT MyColumn ,
*
FROM data.MyTable
WHERE MyColumn <> 0
AND (MyColumn < CONVERT(REAL, 1.18E-38)
OR MyColumn > CONVERT(REAL, 3.40E+38)
)
AND (MyColumn < CONVERT(REAL, -3.40E+38)
OR MyColumn > CONVERT(REAL, -1.18E-38)
)
很容易顯示這些值是如何在表中結束。我不能直接將其插入:
CREATE TABLE a(r REAL NULL);
GO
INSERT INTO a(r) VALUES(4.330473E-39);
GO
SELECT r FROM a
GO
DROP TABLE a;
----
0.0
但我可以分爲兩列和範圍值的獲取和外:
CREATE TABLE a
(
r1 REAL NULL ,
r2 REAL NULL ,
r3 REAL NULL
) ;
GO
INSERT INTO a
(r1, r2)
VALUES (4.330473E-38, 1000) ;
GO
UPDATE a
SET r3 = r1/r2 ;
SELECT r1 ,
r2 ,
r3
FROM a
r1 r2 r3
------------- ------------- -------------
4.330473E-38 1000 4.330433E-41
所以我想MSDN給出了有效數據的錯誤的範圍,是否正確? 我錯過了什麼嗎?
有人提出這是一個錯誤。
這種行爲的哪一部分正是一個錯誤。是:
- 錯誤常量記錄在MSDN和DBCC使用,以及錯誤的門檻,向下取整。
- 更新能夠保存錯誤值
似乎是一個錯誤,你有沒有在你最喜歡的地方申請呢?我想你可以添加自己的約束,像'CHECK(r3> 3.40E-38)':-) –
@AaronBertrand我可以肯定地添加一個約束,但我想了解爲什麼SQL Server不像記錄文件那樣工作。 –
dbcc checktable('a')with DATA_PURITY':列「r3」值超出數據類型「real」的範圍。將列更新爲合法值。舉報... –