【发布时间】:2018-12-15 06:33:04
【问题描述】:
在尝试确定“.”之后的小数位数时,我一直在许多对象上使用这段代码。我将数据移动到的目标系统只能处理 2 d.p。所以我们找到了>2 d.p的数据。我乘以 10、100、1000,并将“每单价”字段值乘以相同的因子。
SELECT
HQPROD, [HQPR1],
Decimals = CASE Charindex('.', [HQPR1])
WHEN 0 THEN 0
ELSE LEN(CAST(CAST(REVERSE(CONVERT(VARCHAR(50), [HQPR1], 128)) AS FLOAT) AS BIGINT))
END
FROM
[SM_REP].[dbo].[BPCSF64_HQT]) EDP ON P.HQPROD = EDP.HQPROD
我正在使用的列数据类型是DECIMAL(15,5)。
样本数据:
HQPROD HQPR1
--------------------------
47001-RM64 175.89900
47001-T06OX 5.84500
47002-20T 80.44700
47002-T24 98.10300
47002-T32 144.07000
47003-01 1.54000
47003-02 1.54000
47003-03 0.51000
错误信息:
将数据类型 varchar 转换为 float 时出错。
【问题讨论】:
-
有负值吗?
reverse()会将-符号放在字符串的末尾,然后不能将其转换为浮点数。 -
为什么不将所有内容乘以 1000 而忘记这些技巧?
-
如果我只是乘以1000,有些目标字段会太大。表中有1个值为负值。
标签: sql sql-server decimal ssms