Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server s十进制的字符串表示不能转换为int),但'返回0,即使是数字的表示值“无法转换”。大小写 当(LNSEQNBR/16384)%1=0时,则为1 其他0 结束_Sql Server_Tsql_Casting_Integer_Isnumeric - Fatal编程技术网

Sql server s十进制的字符串表示不能转换为int),但'返回0,即使是数字的表示值“无法转换”。大小写 当(LNSEQNBR/16384)%1=0时,则为1 其他0 结束

Sql server s十进制的字符串表示不能转换为int),但'返回0,即使是数字的表示值“无法转换”。大小写 当(LNSEQNBR/16384)%1=0时,则为1 其他0 结束,sql-server,tsql,casting,integer,isnumeric,Sql Server,Tsql,Casting,Integer,Isnumeric,使用TRY\u CONVERT,它是.NET中TryParse的SQL替代品。IsNumeric()不知道空字符串被计为(整数)零,并且一些完全有效的货币符号本身不会转换为(货币)零 我有同样的问题。我终于用了 where ATTRIBUTE != round(ATTRIBUTE) 它对我很有效我尝试了这个脚本并得到了答案 WHERE IsNumeric(value + 'e0') = 1 AND CONVERT(FLOAT, value) BETWEEN -2147483648 AND 21

使用TRY\u CONVERT,它是.NET中TryParse的SQL替代品。IsNumeric()不知道空字符串被计为(整数)零,并且一些完全有效的货币符号本身不会转换为(货币)零


我有同样的问题。我终于用了

where ATTRIBUTE != round(ATTRIBUTE)

它对我很有效

我尝试了这个脚本并得到了答案

WHERE IsNumeric(value + 'e0') = 1 AND CONVERT(FLOAT, value) BETWEEN -2147483648 AND 2147483647
ISNUMERIC(Replace(Replace([enter_your_number],'+','A'),'-','A') + '.0e0')
例如,以上问题的答案如下:

SELECT @MY_VAR = CAST(MY_FIELD AS INT)
FROM MY_TABLE
WHERE MY_OTHER_FIELD = 'MY_FILTER' and ISNUMERIC(Replace(Replace(MY_FIELD,'+','A'),'-','A') + '.0e0') = 1


博客文章中显示的功能在几个方面存在缺陷。不要用它!!!这些输入返回肯定的结果,这显然是不正确的:SELECT/*超过18个字符的函数应接受MAX数据类型,并对无效长度进行更多测试*/dbo.IsInt32('999999999999999999999999999999 30'),/*18个字符,但显然不是有效的int*/dbo.IsInt32('99999999999999999');我试图提出一个解决所有边境案件的解决方案:同意这可能是一个非常棘手的问题。但对于基本整数(即1到1000之间的数字)测试非常有效。在本例中,您可以轻松地在字符串中添加长度检查。@Joshua-
SELECT ISNUMERIC(CHAR(11)+'.e0')
在本例中返回
0
,从而通过测试,而不是失败如果输入长度超过38个字符,纯T-SQL函数将失败并出现“数据截断”错误。请参阅我将此解决方案与当前接受的答案进行比较的地方。
ISNUMERIC(',')
返回1(true),IMO为false!虽然我经常遇到令人不安的数据库,但我想说,设计糟糕的数据库并不总是开发人员的错。在大多数情况下,预算是你真正的敌人。因为
SELECT ROUND('abc',0)
引发了一个异常。我不认为这个问题意味着需要确定字符串是否为int。更新:SQL的更高版本有
TRY\u CONVERT
function@Nick.McDermaid:或自SQL-Server-2012起,只需:尝试\u转换(my\u字段为整数)…假设您只想返回正整数。@DatumPoint您是对的,它适用于正整数或0。这不适用于逗号分隔的值。例如,ISNUMERIC('123456789')返回1这已包含在a中。对于我来说,当
fieldname
包含类似“Test”的非数字字符串时,这会导致错误。您好,Grady,T-SQL中的LNSEQNBR是什么?答案16384是什么?这是我用的解决方案。它还有一个额外的好处,那就是它是什么整数的教科书定义。我会把这一个标记为OP问题的答案。有时你会得到你想要使用的东西,而你想要使用的可能是一个糟糕的数据库设计。嗨,这个问题已经有8年了,已经有了一个公认的答案。这应该是一个评论,而不是一个答案。我看不出四舍五入如何解决问题中提到的问题。
CASE
WHEN ROUND(MY_FIELD,0)=MY_FIELD THEN CAST(MY_FIELD AS INT)
ELSE MY_FIELD
END
as MY_FIELD2
WHERE IsNumeric(MY_FIELD) = 1 AND CAST(MY_FIELD as VARCHAR(5)) NOT LIKE '%.%'
SELECT A from TABLE where isnumeric(A)=1
SELECT numstr
  FROM table
 WHERE numstr NOT LIKE '%[^0-9]%'
declare @i numeric(28,5) = 12.0001 if (@i/cast(@i as int) > 1) begin select 'this is not int' end else begin select 'this is int' end
SELECT *
FROM MY_TABLE
WHERE CHARINDEX('.',MY_FIELD) = 0 AND CHARINDEX(',',MY_FIELD) = 0       
AND ISNUMERIC(MY_FIELD) = 1 AND CONVERT(FLOAT,MY_FIELD) / 2147483647 <= 1
DECLARE @Converted as INT
DECLARE @IsNumeric BIT

BEGIN TRY
    SET @Converted = cast(@ValueToCheck as int)
    SET @IsNumeric=1
END TRY
BEGIN CATCH
    SET @IsNumeric=0
END CATCH

select IIF(@IsNumeric=1,'Integer','Not integer') as IsInteger
 ISNUMERIC(table.field) > 0 AND PATINDEX('%[^0123456789]%', table.field) = 0
SELECT *
FROM table    
WHERE fieldname % 1 = 0
DECLARE @input VARCHAR(10)='102030.40'
SELECT PATINDEX('%[^0-9]%',RTRIM(LTRIM(@input))) AS IsNumber
DECLARE @foo varchar(200)
SET @foo = '0123' 
-- SET @foo = '-0123' 
-- SET @foo = '+0123' 
-- SET @foo = '+-0123' 
-- SET @foo = '+-0123' 
-- SET @foo = '.123' 
-- SET @foo = '1.23' 
-- SET @foo = '.' 
-- SET @foo = '..' 
-- SET @foo = '0123e10' 

SELECT CASE WHEN TRY_CAST(@foo AS integer) IS NULL AND @foo IS NOT NULL THEN 0 ELSE 1 END AS isInteger 
SELECT CASE WHEN ISNUMERIC(@foo + '.e0') = 1 THEN 1 ELSE 0 END AS isInteger 
SELECT CONVERT(int,V.S)
FROM (VALUES('1'),
            ('900'),
            ('hello'),
            ('12b'),
            ('1.1'),
            ('')) V(S)
WHERE ISNUMERIC(V.S) = 1;
SELECT TRY_CONVERT(int,V.S),
       V.S,
       ISNUMERIC(V.S)
FROM (VALUES('1'),
            ('900'),
            ('hello'),
            ('12b'),
            ('1.1'),
            ('')) V(S)
--WHERE TRY_CONVERT(int,V.S) IS NOT NULL; --To filter to only convertable values
SELECT @MY_VAR = CASE WHEN TRY_CONVERT(INT,MY_FIELD) IS NOT NULL THEN MY_FIELD
                 ELSE 0
                 END
FROM MY_TABLE
WHERE MY_OTHER_FIELD = 'MY_FILTER'
where ATTRIBUTE != round(ATTRIBUTE)
WHERE IsNumeric(value + 'e0') = 1 AND CONVERT(FLOAT, value) BETWEEN -2147483648 AND 2147483647
ISNUMERIC(Replace(Replace([enter_your_number],'+','A'),'-','A') + '.0e0')
SELECT @MY_VAR = CAST(MY_FIELD AS INT)
FROM MY_TABLE
WHERE MY_OTHER_FIELD = 'MY_FILTER' and ISNUMERIC(Replace(Replace(MY_FIELD,'+','A'),'-','A') + '.0e0') = 1