【问题标题】:Issue with datatype Money in SQL SERVER vs stringSQL SERVER 与字符串中数据类型 Money 的问题
【发布时间】:2017-06-26 10:26:27
【问题描述】:

我有一个电子表格,可以将所有值加载到 SQL Server 中。电子表格中的字段之一恰好是钱。现在为了正确显示所有内容 - 我在我的 tbl 中添加了一个字段,其中 Money 作为 DataType。

当我从电子表格中读取值时,我几乎会将其存储为字符串,例如...“94259.4”。当它被插入到 sql server 中时,它看起来像这样 "94259.4000"。当我从数据库中获取 sql server 值时,有没有办法基本上摆脱 sql server 值中的 0 - 因为我遇到的问题是 - 即使这两个值相同 - 因为它们都是比较的作为字符串 - 它认为没有相同的值。

当值可能看起来像这样时,我预见到另一个问题...94,259.40 我认为可能有效的方法是将数字限制为 2 之后。所以只要我从 Server 中选择这种格式的值 94,259.40 - 我觉得应该没问题。

编辑:

For Column = 1 To 34
    Select Case Column
        Case 1  'Field 1
           If Not ([String].IsNullOrEmpty(CStr(excel.Cells(Row, Column).Value)) Or CStr(excel.Cells(Row, Column).Value) = "") Then
  strField1 = CStr(excel.Cells(Row, Column).Value)
           End If
        Case 2 'Field 2
        ' and so on

我遍历每个字段并将值存储为字符串。然后我将它与数据库进行比较,看看是否存在具有相同值的记录。在我看来唯一的字段是 Money 字段。

【问题讨论】:

  • 很久以前吸取的丑陋教训:从不,从不,从不,从不,从不,永远,在 SQL Server 中使用 MONEY 数据类型。它使小狗受伤并导致宇宙不平衡。
  • 必须有某种机制将电子表格数据传输到 SQL Server...
  • @Bobski 从不用钱。 从不将数字或日期数据存储为文本。只要你使用了错误的数据类型并且不解释数据是如何进入 SQL Server 的,就不可能提供帮助。顺便说一句,Excel 没有类型。只有文本格式样式。都是文字或数字。修复表格类型并更改加载工具或流程以正确解析和加载数字数据。所有工具都允许您导入指定格式或排序规则的数字
  • @user3272686 - 见编辑
  • 撇开双曲线 cmets 不谈,金钱是一种完全有效的数据类型,有时也是谨慎的选择。

标签: sql-server string type-conversion money-format


【解决方案1】:

核心问题是字符串数据被用来表示数字信息,因此比较“123.400”和“123.4”并出现不匹配的问题。它们应该不匹配。它们是字符串。

解决方案是以适当的形式(数字)将数据存储在电子表格中,然后为数据库选择适当的格式 - 这不是“金钱”数据类型(插入颤抖和秃鹫在头顶盘旋的景象)。否则,当您在两个设计不当的解决方案之间来回切换时,您将在类型之间进行大量转换,并发现越来越多“不太有效”的边缘情况,需要更多特殊情况......等等。

【讨论】:

  • 很公平!不是我开发的,需要它才能工作。不要认为我可以更改数据类型 - 太深入了。
  • 足够公平的 backatcha :) 你能发布你用来从你的表中提取数据的查询(用于比较)吗?
【解决方案2】:

你可以使用 Format() 来比较字符串,甚至是 Float 例如:

Declare @YourTable table (value money)
Insert Into @YourTable values
(94259.4000),
(94259.4500),
(94259.0000)

Select Original  = value
      ,AsFloat   = cast(value as float)
      ,Formatted = format(value,'0.####')
 From  @YourTable

退货

Original    AsFloat     Formatted
94259.40    94259.4     94259.4
94259.45    94259.45    94259.45
94259.00    94259       94259

我应该注意到 Format() 有一些很棒的功能,但它的性能并不为人所知

【讨论】:

    猜你喜欢
    • 2019-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2021-11-25
    • 2015-06-18
    • 1970-01-01
    相关资源
    最近更新 更多