如何查询 varchar(x) 值的小数位数



我有一个varchar(250(参数值,我想检查小数位数。

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

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

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

--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  

最新更新