我有一个select语句,在select语句中有几个列执行基本计算(例如Col1 * 3.14)。但是,有时我会遇到非数字值,当这种情况发生时,整个存储过程会因为一行而失败。
我考虑过使用WHERE ISNUMERIC(Col1) <> 0,但接下来我将排除其他列中的信息。
TSQL中是否有一种将所有刺替换为NULL或0的方法??
发布于 2018-03-16 14:31:39
我更喜欢Try_Cast:
SELECT
someValue
,TRY_CAST(someValue as int) * 3.14 AS TRY_CAST_to_int
,TRY_CAST(someValue as decimal) * 3.14 AS TRY_CAST_to_decimal
,IIF(ISNUMERIC(someValue) = 1, someValue, null) * 3.14 as IIF_IS_NUMERIC
FROM (values
( 'asdf'),
( '2' ),
( '1.55')
) s(someValue)发布于 2018-03-16 13:46:46
就像..。
SELECT blah1, blah2, blah3
CASE WHEN ISNUMERIC(Col1) = 1 THEN [Col1] * 3.14 ELSE NULL END as whatever
FROM your_table也可以证明..。
发布于 2018-03-16 14:20:57
ISNUMERIC是一种很糟糕的方法,因为有太多的东西被标识为NUMERIC,它们不能乘以非MONEY数据类型。
https://www.brentozar.com/archive/2018/02/fifteen-things-hate-isnumeric/
这很糟糕,因为“-”是个数字.
DECLARE @example TABLE (numerics VARCHAR(10));
INSERT INTO @example VALUES ('-')
SELECT CASE WHEN ISNUMERIC(numerics) = 1 THEN numerics * 3.14 ELSE NULL END
FROM @example;尝试TRY_CAST (尽管修改您的十进制精度以满足您的需要):
DECLARE @example TABLE (numerics VARCHAR(10));
INSERT INTO @example VALUES ('-')
SELECT TRY_CAST(numerics AS decimal(10,2)) * 3.14 FROM @example;https://stackoverflow.com/questions/49322240
复制相似问题