Ошибка при преобразовании varchar в float в SQL Server 2012

#sql-server

#sql-сервер

Вопрос:

Я импортировал большую электронную таблицу Excel в свою базу данных SQL Server, и все столбцы по умолчанию имеют varchar тип данных. У меня также есть NULL значения в моих столбцах ( sale column). Я хочу выбрать sale volume as float (double) , который находится в varchar формате.

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

 SELECT
    [CompanyCode] AS 'Company Code',
    [Sitecode] AS 'Site Code',
    [Product] AS 'Product Name',
    '' AS 'Tank ID',
    CONVERT(DATE, [InvDay]) AS Date,
    CAST([Sales] AS DECIMAL) AS 'Sale Volume',
    '' AS 'Record ID'
FROM
    [dbo].[2019-01]
  

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

1. Вы уверены, что у вас есть все значения в десятичном формате? Чтобы устранить эту ошибку, попробуйте использовать Try_cast и укажите точность в десятичной системе счисления (например, Try_CAST([Sales] как десятичное число (10,5)), чтобы избежать потери любого десятичного значения, а Try_Cast исправит любую ошибку преобразования, преобразовав ее в nulls

2. @Avi спасибо, я предоставил свой обновленный запрос в качестве ответа.

Ответ №1:

Я изменил свой запрос следующим образом, и он работает..

 select 
        [CompanyCode] as 'Company Code',
        [Sitecode] as 'Site Code',
        [Product] as 'Product Name',
        '' as 'Tank ID',
        CONVERT(date, [InvDay]) as  Date,

        SaleV=(CASE
                    WHEN [Sales] ='NULL' THEN 0
                     WHEN [Sales] = '' then 0
                    ELSE
                     CONVERT(decimal(10,4) ,[Sales] )
                     END)


    FROM [dbo].[2018-01]
  

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

1. try_cast сделал бы то же самое / подобное без инструкции case

Ответ №2:

Вы можете попробовать это — изменить свой запрос. Используется функция IsNull() для обработки нулевого значения.

 select 
        [CompanyCode] as 'Company Code',
        [Sitecode] as 'Site Code',
        [Product] as 'Product Name',
        '' as 'Tank ID',
        CONVERT(date, [InvDay]) as  Date,
        CAST(ISNULL([Sales],0) as decimal(10,2)) as 'Sale Volume',
        '' as 'Record ID'
From [dbo].[2019-01]
  

Примечание: Приведенный выше запрос вернет 0.00 в случае null и выдаст ошибку в случае string. для обработки строкового значения используйте приведенный ниже запрос, приведенный ниже запрос вернет 0.00 в случае строки или NULL, в противном случае преобразуйте в десятичное число

 select 
        [CompanyCode] as 'Company Code',
        [Sitecode] as 'Site Code',
        [Product] as 'Product Name',
        '' as 'Tank ID',
        CONVERT(date, [InvDay]) as  Date,
        ISNULL(TRY_CAST([Sales] as decimal(10,2)), 0) as 'Sale Volume',
        '' as 'Record ID'
From [dbo].[2019-01]