2013-01-23 1 views
1

У меня есть поле varchar, которое всегда должно содержать числовое (десятичное) значение при применении фильтра. Но я получаю «Ошибка преобразования типа данных VARCHAR в числовой», когда я бегу SQL как это:Преобразование varchar в десятичный с использованием isnumeric без исключения исключения в SQL Server 2008

SELECT CAST(A.text AS numeric(38,16)) 
FROM Answers A 
INNER JOIN Questions Q ON Q.ID = A.QuestionID 
WHERE Q.Text = 'Rating' 
AND isnumeric(A.text) = 1 

Существует только одна величина, которая проходит IsNumeric тест, но не бросок:

DECLARE @text varchar(100) 
SET @text = '2.83417869359255E-02' 
SELECT CASE WHEN ISNUMERIC(@text) = 1 THEN CAST(@text AS NUMERIC(38,16)) ELSE NULL END 

Как следует Я уверен, что такие ценности обрабатываются? В конце дня я хочу подсчитать все значения, которые меньше 5, поэтому числа, такие как «2.83417869359255E-02», могут быть округлены до нуля. Я также выполнить запрос, чтобы исследовать значения в таблице вместе с длиной VARCHAR с этими результатами:

MaxValue    MinValue    LenVarChar 
-------------------- -------------------- ----------- 
0     0     1 
10     10     2 
2.2     9.2     3 
3.55     6.32     4 
5.453125    5.453125    8 
2.79989361763  9.47216796875  13 
2.089115858078  9.132080078125  14 
1.1529632806778  9.8538990020752  15 
0.64174896478653  9.83681106567383  16 
0.111961431801319 0.991760730743408 17 
2.83417869359255E-02 2.83417869359255E-02 20 

ответ

1

Не хранить числа как строки будет моим предпочтительным решением, но вы всегда можете проверить D или E а затем бросить сначала плавать.

DECLARE @text VARCHAR(100) 

SET @text = '2.83417869359255E-02' 

SELECT 
    CASE 
    WHEN ISNUMERIC(@text) = 1 
    THEN  CASE 
       WHEN @text LIKE '%[DE]%' 
       THEN CAST(CAST(@text AS FLOAT) AS NUMERIC(38, 16)) 
       ELSE @text 
       END 
    END 

Есть еще потенциально проблемные входы, однако, такие как $ (который проходит тест ISNUMERIC, но требует приведения к money)

+0

На самом деле для моих целей (нахождение значения менее 5) можно преобразовать их все держаться на плаву. И в какой-то момент в будущем я создам десятичное поле в таблице «Ответ» для хранения десятичных ответов, а затем воспользуюсь этой методикой, чтобы заполнить ее из поля varchar. И для тех, кому нравится, когда нужно понимать поплавки, десятичные знаки и цифры, вот ссылка: http://stackoverflow.com/q/1056323/150342 – Colin

Смежные вопросы