首页 > 解决方案 > 如何查询小数位数的 varchar(x) 值

问题描述

我有一个 varchar(250) ParameterValue,我想检查其中的小数位数。

这是我无法工作的代码行:

where RIGHT(CAST(ParameterValue as DECIMAL(10,5)), ParameterValue), 1) != 0

下面的代码是使用代码行的地方:

select * 
INTO    #ParamPrecision
from Data_table
where RIGHT(CAST(ParameterValue as DECIMAL(10,5)), ParameterValue), 1) != 0
AND     ParameterBindStatus = 0

UPDATE  a
SET     a.ParameterBindStatus = 5
FROM    Data_table, #ParamPrecision b
WHERE   a.SQLParameterId = b.SQLParameterId

INSERT  Log_table
        (
        SQLBatchId,
        SQLProcess,
        Error,
        SQLError_Message,
        ParametersSent
        )
SELECT  SQLBatchId,
        'sp_ReadParametersToBindData',
        1,
        'Invalid parameter value sent from MES',
        'some parameter info'
FROM    #ParamPrecision

SELECT  *
INTO    #UnBoundPrompt
FROM    Data_table
WHERE   DATEADD(DAY, 1, SQLTimeStamp) < GETDATE()
AND     ParameterBindStatus = 0

UPDATE  a
SET     a.ParameterBindStatus = 99
FROM    Data_tablea, #UnBoundPrompt b
WHERE   a.SQLParameterId = b.SQLParameterId

INSERT  Log_table
        (
        SQLBatchId,
        SQLProcess,
        Error,
        SQLError_Message,
        ParametersSent
        )
SELECT  SQLBatchId,
        'sp_ReadParametersToBindData',
        1,
        'Parameter download timeout',
        'some parameter info'
FROM    #UnBoundPrompt

如果不满足小数位检查,则下一个 select 语句检查参数时间戳是否活动超过 1 天。如果满足此条件,则生成日志条目。

如果小数位数超过 4,那么我想设置 ParameterBindStatus = 5 并更新日志表。

我已将代码更改如下,以允许我确认其余代码并且有效,但在尝试检测小数位数时代码不会执行。

select * 
INTO    #ParamPrecision
from Data_table
where ParameterValue > '1500'
AND     ParameterBindStatus = 0

标签: sql-server

解决方案


这可能有助于解决您的精度问题 - 我已将其布置为表格,因此您可以看到转换的每个步骤,但您可以轻松看到模式:) 基本上您只需反转字符串并截断它。包括所有步骤(可以更快地完成) - 对于没有小数点的情况,您可能/可能不需要添加一点。

--setup
create table test 
(stringVal varchar(250));

insert into test values
('12.3456'),
('1.2345678'),
('12'),
('0.123')

--query
SELECT stringVal,
        Reverse(CONVERT(VARCHAR(50), stringVal, 128)) as reversedText
      , Cast(Reverse(CONVERT(VARCHAR(50), stringVal, 128)) as float) as float
      , Cast(Cast(Reverse(CONVERT(VARCHAR(50), stringVal, 128)) as float) as bigint) as bigint
      , len(Cast(Cast(Reverse(CONVERT(VARCHAR(50), stringVal, 128)) as float) as bigint)) as decimalPrecision
FROM   test  

推荐阅读