Zgodnie z MSDN, zakres rzeczywistych wartości wynosi - 3,40E + 38 do -1.18E - 38, 0 i 1,18E - 38 do 3,40E + 38. Mam jednak dość kilka wartości poza tym zakresem w mojej tabeli.PRAWDZIWE wartości trzymania kolumny poza udokumentowanym zakresem
Następująca kwerenda zwraca wiele bardzo małych wartości i nie bardzo duże te:
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)
)
Łatwo pokazać, w jaki sposób kończy się w tabeli te wartości. Nie mogę wstawić je bezpośrednio:
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
Ale mogę podzielić dwie kolumny i dostać a poza zakres wartości:
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
Więc myślę MSDN daje błędne zakresy prawidłowych danych, prawda? Czy brakuje mi czegoś?
Kilka osób zasugerowało, że jest to błąd.
Którą częścią tego zachowania jest właśnie błąd. jest to:
- Wrong stałych udokumentowanych w MSDN i używanych w DBCC, a także nieprawidłowy próg do zaokrąglania w dół.
- Aktualizacja jest w stanie zapisać błędne wartości
Wygląda jak błąd, masz złożyła ona w swoim ulubionym miejscu? Sądzę, że można dodać własne ograniczenia, takie jak 'CHECK (r3> 3.40E-38)' :-) –
@AaronBertrand Mogę zdecydowanie dodać ograniczenie, ale chciałbym zrozumieć, dlaczego SQL Server nie zachowuje się jak udokumentowane. –
'dbcc checktable ('a') z DATA_PURITY': Kolumna" r3 "jest poza zakresem dla typu danych" rzeczywisty ". Zaktualizuj kolumnę do wartości prawnej. Zgłoś to ... –