SQL Server中iInteger的最佳等效项

SQL Server中iInteger的最佳等效项,sql,sql-server,regex,tsql,Sql,Sql Server,Regex,Tsql,在SQL Server 2000/2005/2008中,确定字段值是否为整数的最佳方法是什么 对于不可能转换为整数的各种格式,IsNumeric返回true。例如“15000”和“15.1” 您可以使用like语句,但这似乎只适用于具有预定位数的字段 select * where zipcode like '[0-9][0-9][0-9][0-9][0-9]' 我可以编写一个用户定义的函数,尝试在try/catch块中将varchar参数转换为int,但我正在与社区联系,看看是否有人遇到过任何

在SQL Server 2000/2005/2008中,确定字段值是否为整数的最佳方法是什么

对于不可能转换为整数的各种格式,IsNumeric返回true。例如“15000”和“15.1”

您可以使用like语句,但这似乎只适用于具有预定位数的字段

select * where zipcode like '[0-9][0-9][0-9][0-9][0-9]'
我可以编写一个用户定义的函数,尝试在try/catch块中将varchar参数转换为int,但我正在与社区联系,看看是否有人遇到过任何成功的方法来实现这一目标——最好是可以在SQL语句的where子句中使用的方法,而无需创建其他对象。

1方法是

zipcode NOT LIKE '%[^0-9]%'
双重否定,一定要爱他们

如果是SQL Server 2005+,我会。对于SQL Server 2000


然后我将使用正则表达式:^\d{5}$

也许您应该只在整数数据类型中存储整数数据。

处理负数的延迟项

ISNUMERIC(zipcode + '.0e0') --integer
ISNUMERIC(zipcode + 'e0')  --decimal

有关详细信息,请参见

此表达式为1表示整数值,否则为0

floor((floor(abs(zipcode)))/abs(zipcode))

我在另一个StackO问题上找到了完美的答案。 这也证明了你不能像这里一个用户建议的那样使用.0e0。 它不需要CLR或非标量函数。
请查看:

为什么不使用以下选项?我看不出有任何失败的案例

1=整数 0=非整数 null=非数字
在转到sql 2008之后,我遇到了isnumeric“\8”返回true的问题,但在转换为整数时抛出了一个错误。显然,正斜杠是日元或韩元的有效货币

我的解决办法是

case when ISNUMERIC(@str) > 0 and not rtrim(@str) LIKE '[^0-9]%'  and not rtrim(@str) LIKE '%[^0-9]' and not rtrim(@str) LIKE '[^0-9]%' then rtrim(@str) else null end
看看下面的代码是否有帮助。 在以下值中,只有92147483647、1234567符合以下条件: 整数我们可以将其创建为函数并使用它


我用了一个案例陈述:
CastCase当Quantity/[of Days]=CastQuantity/[of Days]为int时,则absQuantity/[of Days]否则0结束为int

要测试输入值是否为整数,我们可以使用SQL SERVER的SQL\u VARIANT\u属性函数

下面的SQL脚本将获取输入并测试数据类型是否为整数

declare @convertedTempValue bigint, @inputValue nvarchar(255) = '1' --Change '1' to any input value
set @convertedTempValue = TRY_PARSE(@inputValue as bigint) --we trying to convert to bigint
declare @var3 nvarchar(255) = cast (SQL_VARIANT_PROPERTY(@convertedTempValue,'BaseType') as nvarchar(255)) --we using SQL_VARIANT_PROPERTY to find out datatype
if ( @var3 like '%int%')
    begin
    print 'value is integer'
    end
else
    begin
    print 'value is non integer'
    end
go

真的很晚了,但这行吗

从表中选择* 其中ISNUMERICzipcode=0或类似于“%
过滤掉整数项。

肯定是我要找的类型。。。尽管它遗漏了“-1”和include。也就是说,我喜欢它。哇,这是一个神秘但迷人的作品。感谢您提供更多信息:我发现IsNumericNullifTrimRTrimzipCode,+'.0e0'在空格和空字符串方面与普通isnumeric的输出更接近。这可能对某些人来说是可取的。你摇滚,今天为我节省了很多时间。数字是微软的一个秘密笑话。选择ISNUMERIC“$”、ISNUMERIC“-”、ISNUMERIC“+”、ISNUMERIC“.”,ISNUMERIC“\123”在所有情况下都返回1 true。它在现实世界中没有任何价值。永远不要使用它。每次您使用它时,它都会将遥测数据发送回MS部门。每个月的上周五,不同的SQL团队都会在办公室聚会上聚会,看看谁的傻瓜分数最高。我会使用LIKE或.0e0。您可能无法启用CLRI,我想知道为什么IsInteger在SQL Server中不可用。它也应该在196123E1=196123 x 10^1=1961230=ROUND1961230之后启用;正确的数字检查的合理标准应该是,如果select convertint方法返回1,则@string_int成功。此方法将失败:将varchar值“196123E1”转换为数据类型int时,转换失败。。+'.0e0'方法更好。我认为可以安全地假设这是某个ETL过程的一部分,这是他试图获取的,或者这不是一个真正的选项。这应该是对问题的评论,而不是回答。
CREATE TABLE MY_TABLE(MY_FIELD VARCHAR(50))
INSERT INTO MY_TABLE
VALUES('9.123'),('1234567'),('9'),('2147483647'),('2147483647.01'),('2147483648'), ('2147483648ABCD'),('214,7483,648')

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
DROP TABLE MY_TABLE
declare @convertedTempValue bigint, @inputValue nvarchar(255) = '1' --Change '1' to any input value
set @convertedTempValue = TRY_PARSE(@inputValue as bigint) --we trying to convert to bigint
declare @var3 nvarchar(255) = cast (SQL_VARIANT_PROPERTY(@convertedTempValue,'BaseType') as nvarchar(255)) --we using SQL_VARIANT_PROPERTY to find out datatype
if ( @var3 like '%int%')
    begin
    print 'value is integer'
    end
else
    begin
    print 'value is non integer'
    end
go