Как преобразовать varchar в десятичный в запросе SQL Server?

В моей базе данных я дал столбцы CHARGECODE и CHARGECODE_URGENT с типом данных varchar и длиной 15.

Однако, чтобы вздремнуть, мне нужно, чтобы два данных стали десятичными.

Большинство значений, например, (40 или 55). Но есть еще 44.00 и -450.

Поэтому я попытался преобразовать их с помощью CAST и CONVERT.

string cmdText = @"SELECT SUM(CASE WHEN TEST_URGENT = 'T' THEN CAST(CHARGECODE_URGENT AS decimal) ELSE CAST(CHARGECODE AS decimal) END) AS Somme FROM  JOB_HEADER";

Я также пробовал:

 string cmdText = @"SELECT SUM(CASE WHEN TEST_URGENT = 'T' THEN CONVERT(decimal, CHARGECODE_URGENT) ELSE CONVERT(decimal,CHARGECODE) END) AS Somme FROM  JOB_HEADER";

Я все еще получаю эту ошибку:

An unhandled exception of type 'System.Data.SqlClient.SqlException' occurred in System.Data.dll

Additional information: Error converting data type varchar to numeric.

Тем не менее я проверяю, возможно ли преобразование, и это кажется так. Поэтому я думаю, что у меня проблема с синтаксисом. Спасибо за вашу помощь

Почему вы использовали varchar, если вы хотите decimal в первую очередь?

sticky bit 10.04.2019 13:40

Обоснование ответа Гордона ниже заключается в том, что по крайней мере одно из ваших значений, когда tets_urgent=T не подходит для преобразования в десятичное число. В нем либо есть текст, либо он «пустой».

iainc 10.04.2019 13:45

@stickybit Я стажер, это не «моя база данных». Я использую созданную базу данных, которую не могу редактировать.

Eikli 10.04.2019 13:49

насколько чистые данные?

BugFinder 10.04.2019 13:52

Вы должны быть уверены, что все значения, хранящиеся в таблице, действительны и могут быть преобразованы, иначе вы получите исключения. Может быть, вы можете показать нам некоторые данные.

ericpap 10.04.2019 15:12

@eripap Я проверил строку 1000 в базе данных, и вы правы, ошибка исходила от меня. Даже если большинство значений например (40 или 55) я не видел и 44.00 и -450. Я не могу преобразовать их в десятичную? Извините, если это очевидно, я новичок

Eikli 10.04.2019 15:28
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
68
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте TRY_CAST() или TRY_CONVERT():

SELECT SUM(CASE WHEN TEST_URGENT = 'T'
                THEN TRY_CAST(CHARGECODE_URGENT AS decimal)
                ELSE TRY_CAST(CHARGECODE AS decimal)
           END) AS Somme
FROM JOB_HEADER;

Чтобы найти плохие значения, вы можете сделать:

select CHARGECODE_URGENT
from job_header
where try_cast(CHARGECODE_URGENT as decimal) is null and
      test_urgent = 'T';

а также:

select CHARGECODE
from job_header
where try_cast(CHARGECODE as decimal) is null and
      test_urgent <> 'T';

Я получаю новую ошибку: «TRY_CAST» не является распознанным именем встроенной функции.

Eikli 10.04.2019 13:45

Как я могу суммировать эти два запроса?

Eikli 10.04.2019 13:59

Другие вопросы по теме