【问题标题】:How to key in numeric digit as enter in MS SQL Server 2012 column?如何在 MS SQL Server 2012 列中输入数字?
【发布时间】:2017-05-26 04:21:58
【问题描述】:

我需要在数据库中准确存储数字数据。

假设必须将 123.200 或 123.1 完全保存到数据库中。
但如果列类型设置为十进制且固定为 2 位,则结果将在数据库中出现 123.20 或 123.10。

如果我只想在数据库/报告中显示 123.200 或 132.1,我该怎么办?

不需要系统自动转换为任何其他小数。

【问题讨论】:

  • 将其存储为字符类型而不是数字。

标签: sql sql-server sql-server-2012 numeric


【解决方案1】:

您可以将值“按原样”存储在 varchar 类型中。 这种方法的问题是数据库允许在那里存储任何字符串,即使它不是数字,比如10abc.xyz23

如果您需要知道如何向用户显示号码,则需要以某种方式存储此信息。由于列中的每个数字的格式可能不同,因此您需要为每一行存储此格式信息。

我会将其存储为 decimal 类型,具有足够大的规模和精度以涵盖所有可能的数据范围,此外还有额外的列 DecimalPlaces,其中将包含您的报告引擎的小数位数显示值时应使用。

【讨论】:

  • 感谢您的及时回复,按照您的描述,输入123.40就会消失零。我需要将 123.40 准确地呈现给最终用户。
  • 当用户在您的应用程序中输入123.40 时,它应该解析它并检测到用户输入了 2 个小数位。然后您的应用程序应将此信息(2 位小数)与数值 123.4 一起存储在数据库中。当您的应用程序将此值呈现给用户时,它应该相应地对其进行格式化,因为知道最初用户输入了 2 个小数位。
【解决方案2】:

如果您必须这样做,那么正如其他人所建议的那样,您需要使用字符数据类型来存储它。我还要添加一个计算列,使数值也很容易获得:

create table T (
    Val varchar(39) not null,
    Val_numeric as CONVERT(decimal(38,10),Val) persisted
)
go
insert into T(Val) values
('123.200'),
('123.1')

select * from T

结果:

Val                                     Val_numeric
--------------------------------------- ---------------------------------------
123.200                                 123.2000000000
123.1                                   123.1000000000

当您需要“用户输入”值时,请使用Val。当你需要真正的价值时,你可以使用Val_Numeric。这还具有以下优点(没有复杂的检查约束),您不能在Val 列中输入任何无效值。例如:

insert into T(Val) values ('1.2.3')

产生错误:

Msg 8114, Level 16, State 5, Line 12
Error converting data type varchar to numeric.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-25
    • 2020-08-07
    • 2019-04-22
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-23
    相关资源
    最近更新 更多