下面是一些测试SQL。 IsNumeric表示05031,
的子字符串是数字,但由于,
而尝试将其转换为实际数字时失败。这是SQL中的错误吗?
DECLARE @Str NVARCHAR(20)
SET @Str = 'XYZ 505031, some text'
SELECT CASE WHEN ISNUMERIC(SUBSTRING(@Str,6,7)) = 1 THEN CONVERT(int,SUBSTRING(@Str,6,7)) ELSE 0 END, SUBSTRING(@Str,6,7)
答案 0 :(得分:2)
你应该使用try_cast,因为login.html
的ISNUMERIC评估为1
对于某些非数字字符,例如加号(+),减号( - )和有效货币符号(如美元符号($)),ISNUMERIC返回1。有关货币符号的完整列表,请参阅money和smallmoney(Transact-SQL)。 DECLARE @Str NVARCHAR(20)
5031,
答案 1 :(得分:0)
如果是2012+,您可以使用Try_Convert()。我们使用MONEY因为这将转换前导零,然后我们转换为int
示例强>
DECLARE @Str NVARCHAR(20)
SET @Str = 'XYZ 505031, some text'
SELECT AsInt = IsNull(try_convert(int,try_convert(money,SUBSTRING(@Str,6,7))),0)
, AsStr = SUBSTRING(@Str,6,7)
<强>返回强>
AsInt AsStr
5031 05031,
答案 2 :(得分:0)
这是因为您的substring
最后也在逗号。
SELECT SUBSTRING(@Str, 6, 7);
结果:
05031,
然而,
SELECT SUBSTRING(@Str, 6, 5);
结果:
05031
并且
SELECT CASE WHEN ISNUMERIC(SUBSTRING(@Str,6,5)) = 1 THEN CONVERT(int,SUBSTRING(@Str,6,5)) ELSE 0 END, SUBSTRING(@Str,6,5)
结果:
5031 | 05031