How to convert from nchar to decimal in SQL?
Question
I have 2 tables(source and destination) which are respectively NOR_LABOR and ALL_LABOR_DETAILS. In the source table(NOR_LABOR) there is a column feet_produced with the data type nchar(10). In the destination table(ALL_LABOR_DETAILS) there’s a column labor_feet_produced with the data type decimal(18,4). I want to convert the feet_produced from nchar(10) to decimal(18,4) and paste it in the ALL_LABOR_DETAILS table’s labor_feet_produced column.
I have found a code regarding a similar issue but did not do the exact as I need to do, following is that code snippet :
Select feet_produced AS feet_produced_s, CASE WHEN Isnumeric(feet_produced) = 1 THEN CONVERT(DECIMAL(18,2),feet_produced) ELSE 0 END AS feet_produced INTO [MES_DEV].[dbo].[ALL_LABOR_DETAILS] from [dbo].[NOR_LABOR]
asked 2021-05-10 by MegaTrone
Answer
There are values that will test true for IS_NUMERIC(), but will fail to convert to decimal.
Instead, use TRY_CONVERT() which will return either the successfully-converted-to-decimal value, or a NULL when it fails. (You can then COALESCE to zero to get your desired result).
Here is a short example set of values, using TRY_CONVERT():
SELECT
TryConvert = COALESCE(TRY_CONVERT(decimal(18,4),TestValues),0)
FROM (
VALUES('10.6'),
('ten'),
('7d2'),
('10000000000'),
('10.00000001')
) AS x(TestValues);
The same set of values using your example code will throw an error:
SELECT
IsNumericCase = CASE
WHEN Isnumeric(TestValues) = 1
THEN CONVERT(DECIMAL(18,2),TestValues)
ELSE 0
END
FROM (
VALUES('10.6'),
('ten'),
('7d2'),
('10000000000'),
('10.00000001')
) AS x(TestValues);
This error is returned because 7d2 is numeric, but cannot be converted to decimal.
Error converting data type varchar to numeric.
answered 2021-05-10 by Andy Mallon
