我正在改变一个视图,将地理坐标(具有不同小数精度的数字)转换为十进制字段。
我已确认源表中的唯一项目是数字和小数 - 但我收到错误
“将数据类型varchar转换为数字时出错。”
源表中的十进制是否可能被读取为字符,如果是,我该怎么做才能成功执行此转换?
ALTER VIEW [SCHEMA].[VIEW_V]
AS SELECT
cast(field 1 AS decimal (26,19)) as x_coord
FROM [linkedServer].[Sourcedatabase].[schema].[dt_table]
答案 0 :(得分:4)
尝试使用isnumeric()
或try_convert()
:
ALTER VIEW [SCHEMA].[VIEW_V] AS
SELECT (CASE WHEN isnumeric(field1) = 1
THEN cast(field1 AS decimal(26,19))
END)as x_coord
FROM [linkedServer].[Sourcedatabase].[schema].[dt_table];
或
ALTER VIEW [SCHEMA].[VIEW_V] AS
SELECT try_convert(decimal(26, 19), field1)
FROM [linkedServer].[Sourcedatabase].[schema].[dt_table];
如果结果值为NULL
,您将知道导致问题的行。
答案 1 :(得分:0)
对于带有字符“ e”“ +”的浮点值,如果我们尝试将其转换为十进制,则会出错。 ('2.81104e + 006')。它仍然通过了ISNUMERIC测试。
SELECT ISNUMERIC('2.81104e + 006')返回1。
SELECT convert(decimal(15,2),'2.81104e + 006')返回错误:将数据类型varchar转换为数值时出错。
SELECT try_convert(decimal(15,2),'2.81104e + 006')返回NULL。
SELECT convert(float,'2.81104e + 006')返回正确的值2811040。