tsql如何验证数字的刻度

tsql如何验证数字的刻度,tsql,sql-server-2008-r2,Tsql,Sql Server 2008 R2,我需要验证小数点右边的位数 0,在十分之一、百分之一、千分之一等任何位置都是有效数字 有什么窍门吗?。。。没有一个扩展的正则表达式库,没有内置函数,我更喜欢一个函数,它接受数字,小数位数应该相等,然后返回一点 根据Maess的建议,我提出了以下建议: CREATE FUNCTION [dbo].[GetScale] ( @tsValue varchar(250) , @tiScale int ) RETURNS int AS BEGIN DECLARE

我需要验证小数点右边的位数

0,在十分之一、百分之一、千分之一等任何位置都是有效数字

有什么窍门吗?。。。没有一个扩展的正则表达式库,没有内置函数,我更喜欢一个函数,它接受数字,小数位数应该相等,然后返回一点

根据Maess的建议,我提出了以下建议:

CREATE FUNCTION [dbo].[GetScale] 
(
    @tsValue varchar(250)
    , @tiScale int
)
RETURNS int
AS
BEGIN
    DECLARE
        @tiResult int
        , @tiValueScale int
        SET @tiResult = 0
        SELECT @tiValueScale =  LEN( SUBSTRING ( @tsValue, PATINDEX('%.%', @tsValue) + 1, LEN(@tsValue) ) )
        IF (@tiValueScale = @tiScale)
            SET @tiResult = 1
    RETURN @tiResult
END
GO
似乎工作正常。谢谢你的帮助

作为后续行动。。。我遇到了一个问题,一个数字没有一个小数,它将patindex返回到0,并且该数字与刻度大小相同,它将返回一个假阳性。。。所以我从patindex中添加了一个额外的select来确定它是否存在。。。现在看起来是这样的:

- =============================================
ALTER FUNCTION [dbo].[GetScale] 
(
    @tsValue varchar(250)
    , @tiScale int
)
RETURNS int
AS
BEGIN
    DECLARE
        @tiResult int
        , @tiValueScale int
        , @tiDecimalExists int

        SET @tiResult = 0
        SET @tiDecimalExists = 0

        SELECT @tiDecimalExists = PATINDEX('%.%', @tsValue)

        IF (@tiDecimalExists != 0)
        BEGIN
            SELECT @tiValueScale =  LEN( SUBSTRING ( @tsValue, @tiDecimalExists + 1, LEN(@tsValue) ) )
            IF (@tiValueScale = @tiScale)
                SET @tiResult = 1

        END
    RETURN @tiResult
END
2015年2月5日编辑:


谢谢。我已经包含了小数点前9的修正值。

我尝试了Anthony的解决方案,取得了一些成功,但当第一个整数是9时,会有一些不希望的副作用

例如

   select 0.11 as fraction, Math.NumberOfDecimalPlaces(0.11) dp union
   select 9.1, Math.NumberOfDecimalPlaces(9.1) union
   select 9.01, Math.NumberOfDecimalPlaces(9.01) union
   select 9.0, Math.NumberOfDecimalPlaces(9.0) union
   select 99.0, Math.NumberOfDecimalPlaces(99.0) union
   select 10999.0, Math.NumberOfDecimalPlaces(10999.0) union
   select 8.0, Math.NumberOfDecimalPlaces(8.0) union
   select 0, Math.NumberOfDecimalPlaces(0)
生产

0.00    0
0.11    2
8.00    0
9.00    -1
9.01    2
9.10    1
99.00   -2
10999.00    -3
0.00    0
0.11    2
8.00    0
9.00    0
9.01    2
9.10    1
99.00   0
10999.00    0
当9是第一个整数时,显示了一些错误的计算

我对Anthony的原始功能做了一点改进

CREATE FUNCTION [Math].[NumberOfDecimalPlaces]
(
    @fraction decimal(38,19)
)
RETURNS INT
AS
BEGIN
    RETURN FLOOR(LOG10(REVERSE(ABS(@fraction % 1) +1))) +1
END
这只是将分数的整数部分去掉。实现后会产生

0.00    0
0.11    2
8.00    0
9.00    -1
9.01    2
9.10    1
99.00   -2
10999.00    -3
0.00    0
0.11    2
8.00    0
9.00    0
9.01    2
9.10    1
99.00   0
10999.00    0

正确的结果

您尝试了什么?如果你想按要求编写代码,那么你应该雇佣一位顾问。堆栈溢出用于帮助解决特定问题。将其转换为字符串,在小数点处对其进行解析,并获取表示小数点右侧数字的字符串长度。我曾考虑将其转换为字符串,但我希望找到一些感觉不太像黑客的东西。。。这可能就是我现在要做的anyway@Charles回答您的问题以使其被接受: