SQL SERVER 与字符串中数据类型 Money 的问题
Issue with datatype Money in SQL SERVER vs string
我有一个电子表格,可以将所有值加载到 SQL 服务器中。电子表格中的字段之一恰好是金钱。现在为了正确显示所有内容 - 我在我的 tbl 中添加了一个字段,并将 Money 作为数据类型。
当我从电子表格中读取值时,我几乎将其存储为字符串,例如这样..."94259.4"。当它被插入 sql 服务器时,它看起来像这样 "94259.4000"。当我从数据库中获取 sql 服务器值时,有没有一种方法可以让我基本上摆脱 0 - 因为我 运行 遇到的问题是 - 即使这两个值是相同 - 因为它们都作为字符串进行比较 - 它认为没有相同的值。
我预见到另一个问题,当值可能看起来像这样时...94,259.40 我认为可能有效的方法是在期间之后将数字限制为 2。所以只要我 select 来自服务器的值具有这种格式 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
我遍历每个字段并将值存储为字符串。然后我将它与数据库进行比较,看看是否有具有相同值的记录。唯一妨碍我的字段是货币字段。
核心问题是字符串数据被用来表示数字信息,因此出现了将“123.400”与“123.4”进行比较并出现不匹配的问题。他们应该不匹配。它们是字符串。
解决方案是将数据以正确的形式存储在电子表格中 - 数字,然后 select 数据库的正确格式 - 这不是 "Money" 数据类型(插入颤抖和秃鹰在头顶盘旋的景象)。否则,当您在两个设计不当的解决方案之间来回切换时,类型之间的转换会越来越多,并且会发现越来越多 "don't quite work," 的边缘情况并需要更多特殊情况……等等.
您可以使用 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
Returns
Original AsFloat Formatted
94259.40 94259.4 94259.4
94259.45 94259.45 94259.45
94259.00 94259 94259
我应该注意到 Format() 有一些很棒的功能,但它的性能并不为人所知
我有一个电子表格,可以将所有值加载到 SQL 服务器中。电子表格中的字段之一恰好是金钱。现在为了正确显示所有内容 - 我在我的 tbl 中添加了一个字段,并将 Money 作为数据类型。
当我从电子表格中读取值时,我几乎将其存储为字符串,例如这样..."94259.4"。当它被插入 sql 服务器时,它看起来像这样 "94259.4000"。当我从数据库中获取 sql 服务器值时,有没有一种方法可以让我基本上摆脱 0 - 因为我 运行 遇到的问题是 - 即使这两个值是相同 - 因为它们都作为字符串进行比较 - 它认为没有相同的值。
我预见到另一个问题,当值可能看起来像这样时...94,259.40 我认为可能有效的方法是在期间之后将数字限制为 2。所以只要我 select 来自服务器的值具有这种格式 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
我遍历每个字段并将值存储为字符串。然后我将它与数据库进行比较,看看是否有具有相同值的记录。唯一妨碍我的字段是货币字段。
核心问题是字符串数据被用来表示数字信息,因此出现了将“123.400”与“123.4”进行比较并出现不匹配的问题。他们应该不匹配。它们是字符串。
解决方案是将数据以正确的形式存储在电子表格中 - 数字,然后 select 数据库的正确格式 - 这不是 "Money" 数据类型(插入颤抖和秃鹰在头顶盘旋的景象)。否则,当您在两个设计不当的解决方案之间来回切换时,类型之间的转换会越来越多,并且会发现越来越多 "don't quite work," 的边缘情况并需要更多特殊情况……等等.
您可以使用 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
Returns
Original AsFloat Formatted
94259.40 94259.4 94259.4
94259.45 94259.45 94259.45
94259.00 94259 94259
我应该注意到 Format() 有一些很棒的功能,但它的性能并不为人所知