如何获取ms sql中float列中小数点后的位数?

Bog*_*anM 5 sql-server

我必须计算MS Sql Server(2005或2008无关紧要)托管的数据库中小数点后的数字,以便纠正用户所犯的一些错误.我在Oracle数据库上遇到了同样的问题,但事情并不复杂.底线是Oracle上的选择是:

select length( substr(to_char(MY_FIELD), instr(to_char(MY_FILED),'.',1,1)+1, length(to_char(MY_FILED)))) as digits_length
from MY_TABLE
Run Code Online (Sandbox Code Playgroud)

提交的My_filed是浮点数(38).

在Ms Sql服务器上我尝试使用:

select LEN(SUBSTRING(CAST(MY_FIELD AS VARCHAR), CHARINDEX('.',CAST(MY_FILED AS VARCHAR),1)+1, LEN(CAST(MY_FIELD AS VARCHAR)))) as digits_length
from MY_TABLE
Run Code Online (Sandbox Code Playgroud)

问题是在MS Sql Server上,当我将MY_FIELD转换为varchar时,浮点数仅被截断2位小数并且数字的计数错误.有人可以给我任何提示吗?

最好的祝福.

Ell*_*ute 7

SELECT 
LEN(CAST(REVERSE(SUBSTRING(STR(MY_FIELD, 13, 11), CHARINDEX('.', STR(MY_FIELD, 13, 11)) + 1, 20)) AS decimal)) 
from TABLE
Run Code Online (Sandbox Code Playgroud)


Bog*_*anM 5

我从朋友那里得到了一个非常简单的解决方案.所以我会发布解决方法,以帮助其他人和我一样.

一,制作功能:

create FUNCTION dbo.countDigits(@A float) RETURNS tinyint AS
BEGIN
declare @R tinyint
IF @A IS NULL 
   RETURN NULL
set @R = 0
while @A - str(@A, 18 + @R, @r) <> 0
begin
   SET @R = @R + 1
end
RETURN @R
END
GO
Run Code Online (Sandbox Code Playgroud)

第二:

select MY_FIELD,
dbo.countDigits(MY_FIELD) 
from MY_TABLE
Run Code Online (Sandbox Code Playgroud)

使用该函数将获得小数点后的确切位数.