Случайная ошибка преобразования с использованием функции SUM - PullRequest
1 голос
/ 10 августа 2009

Мое приложение использует sql2000, и оператор select, который он использует, иногда не работает. Раз в неделю или около того, выбор возвращает ошибку

'Ошибка преобразования типа данных varchar в числовой'

SQL:

sum(case when ISNULL(form_prsn_id, -1) = irpd_prsn_id 
                          then convert(dec(11,2), case when valu_value = '' 
                                                       then '0' 
                                                       else isnull
(valu_value,'0') 
                                                        end)* case when  
fmdt_deduction_flag = 'Y' 
                                                                   then -1 
                                                                   else 1 
                                                                    end 
                          else 0 
                           end) as client_sum

Поле valu_value является varchar и хранит некоторые числовые и некоторые varchar. Но включая мое присоединение и фильтр предложений where

всегда будет выбирать числовую или пустую строку. Когда это терпит неудачу, я могу удалить СУММУ, видеть данные и знать, что это числовой. Так почему же функция SUM иногда (скажем, 5% времени) дает сбой для числовых данных. Интересно, будет ли SQL каким-то образом «смотреть в будущее», чтобы гарантировать, что он может преобразовываться в десятичную форму не только для строк, возвращаемых без суммы. Примечание. Я обнаружил исправление, в которое я включаю (где isNumeric (valu_value) = 1)

Спасибо

Ответы [ 4 ]

1 голос
/ 10 августа 2009

Такие вещи случаются (иногда). Проблема (почти) всегда в плане выполнения, который SQL Server генерирует для вашего запроса. Может случиться так, что SQL Server помещает разговор до того, как вы присоединитесь к оператору / условию. Вот почему вы получаете ошибку.

Формирование определенного плана [выполнения] с помощью подсказок или введения дополнительных условий (как вы это сделали) является ключом к решению таких проблем.

0 голосов
/ 12 марта 2010

Я встречал это раньше, поэтому основная причина может заключаться в том, что SQL Server 2005 обрабатывает преобразование перед выполнением оператора соединения или where, основанного на плане выполнения.

мой случай:

SELECT Convert(decimal(18,0), NVarcharColumn) FROM Table1

Решаю, меняя утверждение на:

SELECT Convert(decimal(18,0), NVarcharColumn) FROM Table1
WHERE isnumeric(NvarcharColumn) = 1
0 голосов
/ 25 августа 2009

Просто подумайте, как вы не говорите, что вы гарантируете, что значение_значения является числовым, но может ли оно содержать запятую? например,

select isnumeric('23,00')

PASS!

select convert(dec(11,2),'23,00')

FAIL - Ошибка преобразования типа данных varchar в числовой.

0 голосов
/ 10 августа 2009

попробуйте это:

sum(case
        when ISNULL(form_prsn_id, -1) = irpd_prsn_id then convert(dec(11,2), case
                                                                                 when ISNUMERIC(valu_value)=1 THEN valu_value
                                                                                 else 0
                                                                             end
                                                                 )* case
                                                                        when fmdt_deduction_flag = 'Y' then -1 
                                                                        else 1 
                                                                    end 
        else 0 
    end
   ) as client_sum

разница здесь:

OLD

case
    when valu_value = ''  then '0'
    else isnull(valu_value,'0')
end

NEW

case
    when ISNUMERIC(valu_value)=1 THEN valu_value
    else 0
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...