Ошибка преобразования varchar в числовой с помощью MSSQL

#sql-server

#sql-сервер

Вопрос:

Запрос

 SELECT TOP 1000
CASE WHEN VRI.Square_Footage <> '' 
THEN VRI.Square_Footage 
ELSE 
    CASE WHEN VRI.Property_Type = 'LAND' 
        THEN CAST((CONVERT(NUMERIC(38, 3),VRI.Acres)*43560) AS DECIMAL) 
    ELSE 
        VRI.Lot_Size 
    END 
END
FROM View_Report_Information_Tables AS VRI
  

Даже если я проверил VRI.Acres с isnumeric() помощью, это все равно выдает ту же самую ошибку? Как я могу исправить эту проблему?

Комментарии:

1. @Conrad Frix: Спасибо за редактирование! Кстати, у тебя очень классный аватар ;)!

Ответ №1:

ISNUMERIC не гарантирует, что он будет успешно приведен к decimal .

 SELECT ISNUMERIC('£100') /*Returns 1*/

SELECT CONVERT(NUMERIC(38, 3),'£100') /*Error*/
  

Кроме того, все ветви case инструкции должны возвращать совместимые типы данных. Похоже, что VRI.Square_Footage это строка.

Работает ли это для вас?

 SELECT TOP 1000 CASE
                  WHEN ISNUMERIC(VRI.Square_Footage   'e0') = 1 THEN
                  VRI.Square_Footage
                  WHEN VRI.Property_Type = 'LAND'
                       AND ISNUMERIC(VRI.Acres   'e0') = 1 THEN CAST((
                  CONVERT(NUMERIC(38, 3), VRI.Acres) * 43560 ) AS DECIMAL)
                  WHEN ISNUMERIC(VRI.Lot_Size   'e0') = 1 THEN VRI.Lot_Size
                END
FROM   View_Report_Information_Tables AS VRI  
  

Комментарии:

1. @Martin: Спасибо. Да, VRI.Square_Footage это на самом varchar деле. Как я могу обойти эту проблему?

2. Это. Вы не можете смешивать строки и числа в одном столбце. Один из них должен быть преобразован в другой.

3. @Джерри Ритси: Так это значит, что я должен преобразовать все varchar в десятичное число?

4. @Chan — Единственным способом смешивания (нечисловых) строк и чисел было бы приведение к sql_variant или приведение чисел в виде строк. Можете ли вы привести пример данных, из-за которых произошел сбой?

5. @Conrad Frix: Я бы согласился с вами. К сожалению, это принадлежит команде SQL, я за это не отвечаю. Кстати, я только что преобразовал его обратно в varchar , и sql-запрос выполняется нормально.

Ответ №2:

Здесь запустите это

  SELECT ISNUMERIC('d25')
  

Это может быть преобразовано в значение с плавающей запятой, но не в десятичную / числовую

 SELECT CONVERT(FLOAT,'2d5')
  

Как вы можете видеть, вы не можете зависеть от numeric для десятичных / числовых типов данных

Взгляните на IsNumeric, IsInt, IsNumber, чтобы найти некоторый код, который покажет вам, как вы можете проверить