Poniżej znajduje się podzbiór rodzaju struktury tabeli i danych, z którymi pracuję.Błąd przepełnienia arytmetycznego konwertujący varchar na typ danych liczbowych. '10' <= 9.00
CREATE TABLE #Test
(
Val varchar(5)
,Type varchar(5)
)
INSERT #Test VALUES ('Yes','Text')
INSERT #Test VALUES ('10','Int')
INSERT #Test VALUES ('10.00','Float')
INSERT #Test VALUES ('9.00','Float')
INSERT #Test VALUES ('9','Int')
Chcę napisać kwerendę, która będzie dać mi znać, jeśli kolumna „Val” jest < = 9.00 (musi być typu danych numerycznych). Zrobiłem to, wykonując następujące czynności:
SELECT *
FROM
(
SELECT Val
FROM #Test
WHERE Type = 'Int'
) IntsOnly
WHERE IntsOnly.Val <= 9.00
Daje mi to błąd błędu arytmetycznego. Jeśli jednak wykluczyć wiersz danych o wartości "10":
SELECT *
FROM
(
SELECT Val
FROM #Test
WHERE Type = 'Int'
AND Val <> '10'
) IntsOnly
WHERE IntsOnly.Val <= 9.00
Działa bez żadnego problemu. Moje pytanie nie polega na rozwiązaniu tego problemu, ponieważ wiem, że mogę po prostu przekształcić dane w wymagany przeze mnie format.
Moje pytanie brzmi, dlaczego wartość "10" w kolumnie "Val" zwraca błąd. Z pewnością logika powinna po prostu zwrócić "False" i po prostu wykluczyć wiersze, ponieważ "10" (które, jak zakładam, jest niejawnie skonwertowane) jest większe niż 9.00.
Dzięki.
błąd przepełnienia arytmetyka, jesteś pewien? Nie [błąd konwersji] (http://stackoverflow.com/q/9136722/11683)? – GSerg
Spróbuj być *** *** w konwersji. Co daje 'CAST (val AS DECIMAL (9,2)) <= CAST (9.00 AS DECIMAL (9,2))? – MatBailie
GSerg - Tak, przepełnienie arytmetyczne konwertujące varchar na numeryczne. Dems - To działa! Chciałbym jednak zrozumieć, dlaczego niejawna konwersja nie działa? Myślałem, że to może zrobić to nawrócenie i nie powinno powodować problemu? – JBond