我有一个可以存储文本但是用于存储数字的列(我没有制作系统!)有人将空值放入(即不是内容但不是空)并导致错误: -
Msg 8114,Level 16,State 5,Line 1
将数据类型varchar转换为数字时出错。
我已将问题简化为以下内容: -
SELECT
T1.[FIELD_5],
ISNUMERIC(T1.[FIELD_5]),
NULLIF(T1.[FIELD_5],''),
ISNULL(NULLIF(T1.[FIELD_5],''),0),
CONVERT(DECIMAL(18,5),ISNULL(NULLIF(T1.[FIELD_5],''),0))
FROM
[MyTBL] T1
ORDER BY
ISNUMERIC(T1.[FIELD_5])
问题数据位于[FIELD_5]
NULLIF
已成功将其更改为NULL
值ISNULL
正在将NULLIF
结果转为0
但CONVERT
结果上的ISNULL
会产生错误消息,我希望它会导致0.00000
答案 0 :(得分:2)
使用try_convert()
:
SELECT T1.[FIELD_5], ISNUMERIC(T1.[FIELD_5]), NULLIF(T1.[FIELD_5], ''),
COALESCE(NULLIF(T1.[FIELD_5], ''), 0),
TRY_CONVERT(DECIMAL(18, 5), COALESCE(NULLIF(T1.[FIELD_5], ''), 0))
FROM [MyTBL] T1
ORDER BY ISNUMERIC(T1.[FIELD_5]);
SQL Server 2012中引入了 try_convert()
。如果您使用的是早期版本,则需要使用case
表达式。
(我将ISNULL()
切换为COALESCE()
,因为我更倾向于在可行的情况下使用ANSI标准函数。)
答案 1 :(得分:1)
<强> SQL2012 + 强>
为了找到那些无效的DECIMAL|NUMERIC(18, 5)
值,我会使用TRY_PARSE或TRY_CONVERT函数:
SELECT
T1.ID,
NULLIF(T1.[FIELD_5], '') AS FIELD_5_WithNULLIF
FROM
[MyTBL] T1
WHERE
T1.[FIELD_5] IS NOT NULL -- It removes from end results NULLs (FIELD_5)
AND T1.[FIELD_5] <> '' -- It removes empty or SPACE(n) values (FIELD_5)
AND TRY_PARSE(T1.[FIELD_5] AS DECIMAL(18, 5)) IS NULL -- It removes invalid DECIMAL(18, 5) values (FIELD_5)
TRY_PARSE
的行为如下:如果源字符串值[N][VAR]CHAR
是有效的DECIMAL|NUMERIC(18, 5)
,则它返回具有新数据类型的值,否则返回NULL - &gt;所以它不会抛出异常(“错误”)。
另请参阅:Use new TRY_PARSE() instead of ISNUMERIC() | SQL Server 2012
现在,如果你想将空字符串和无效的源值转换为NULL,那么我会使用
SELECT
T1.ID,
T1.[FIELD_5] AS OriginalValue,
TRY_PARSE(T1.[FIELD_5] AS DECIMAL(18, 5)) AS ConvertedValue
FROM
[MyTBL] T1
答案 2 :(得分:0)
有一些非数字值,您可以使用以下案例进行检查:
SELECT
T1.[FIELD_5],
ISNUMERIC(T1.[FIELD_5]),
NULLIF(T1.[FIELD_5],''),
ISNULL(NULLIF(T1.[FIELD_5],''),0),
CONVERT(DECIMAL(18,5), iif(isnumeric(ISNULL(T1.[FIELD_5]),'0') > 1,T1.[FIELD_5],'0')
ISNULL(NULLIF(T1.[FIELD_5],''),0))
FROM
[MyTBL] T1
ORDER BY
ISNUMERIC(T1.[FIELD_5])
将错误引发为&#34;将数据类型varchar转换为数字时出错。 &#34;
console.log()
答案 3 :(得分:0)
这是一个需要更好调查的案例,我应该意识到,在我看来,SQL通常不会出现用户错误。
我在没有order by
子句的情况下再次运行它,然后选择了在显示的最后一行之后显示的行(即导致错误的那行)。
[FIELD_5]
包含值1E-07
,这是Excel中臭名昭着的错误导入!
什么不加起来是为什么当我按ISNUMERIC
打开订单时,我没有在列表顶部看到这个值,只有正确管理的空白值。
问题解决了,我应该坚持调查,但我认为将来有必要帮助其他调查。