我想将数据从 Varchar 列转换为 Numeric 数据类型-
所以在转换之前,我调用 ISNUMERIC 函数来检查数据是否为数字,如果是,则将其转换为数字数据类型。
- IsNumeric(x) returns true - when varchar value has both comma and a tab character (Char(9)),
- IsNumeric(x) returns false - when varchar value has only tab character and no comma
它在的 SQL 的帮助下解释-
DECLARE @propValue AS VARCHAR(50)
SET @propValue = '1,592 ' -- contains comma + tab (Char(9))
SELECT ISNUMERIC(@propValue) -- Returns 1
--If ISNUMERIC func returns true for this value, lets convert this Varchar value to Numeric
SELECT CAST(@propValue AS Numeric(19, 4)) -- :-( Error converting data type varchar to numeric.
我用 Google 搜索并找到了解决这个问题的各种解决方案-
--Solution 1: use 'e0'
SELECT ISNUMERIC(@propValue + 'e0') -- Returns 0
--Solution 2: remove comma before calling IsNumeric()
SELECT ISNUMERIC(REPLACE(@propValue, ',', '')) -- Returns 0
--Solution 3
--Call CLR function to p Varchar value
在上述情况下推荐的解决方案是什么,为什么?
另外,如果有人可以解释为什么 IsNumeric(x)返回 false-当 varchar 值只有制表符,没有逗号?
非常感谢。
请记住,ISNUMERIC() = 1
并不意味着“可以转换为每个数字类型”,而是“可以转换为至少一个数字类型”。这出现了很多值可以转换为至少一个数字类型,但不是你想要的。一个更基本的例子:
IF ISNUMERIC(256) = 1
SELECT CONVERT(TINYINT, 256);
如果您有已知违规的字符串(如制表符),那么为什么不也替换制表符?
这工作,但它是相当丑陋的:
DECLARE @x TABLE (propValue VARCHAR(50));
INSERT @x SELECT '1,592' + CHAR(9)
UNION ALL SELECT '55' + CHAR(9) + '32'
UNION ALL SELECT CHAR(9) + '7,452.32 '
UNION ALL SELECT 'foo'
UNION ALL SELECT '74';
SELECT CONVERT(NUMERIC(19,4),
LTRIM(RTRIM(REPLACE(REPLACE(propValue, CHAR(9), ''), ',', '')))
)
FROM @x
WHERE ISNUMERIC(LTRIM(RTRIM(REPLACE(REPLACE(propValue,
CHAR(9), ''), ',', ''))) + 'e0') = 1;
虽然不适用于您的确切问题,但我在 10 年前写了一个常见问题:http://classicasp.aspfaq.com/general/what-is-wrong-with-isnumeric.html
ISNUMERIC(RTRIM(LTRIM(x))) = 1
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(72条)