【问题标题】:SQL Server view return 0.00SQL Server 视图返回 0.00
【发布时间】:2016-06-23 11:41:07
【问题描述】:

我认为我有三个选择:

Create view myView
As
Begin
    Select Col1, Col2, Col3 from table1
    Union
    Select Col1, Col2, Col3 from table2
    Union
    Select 0.00 As Col1, 0.00 As Col2, 0.00 As Col3 from table3
End

如果我查询:

Select 0.00 As Col1, 0.00 As Col2, 0.00 As Col3 
from table3

它为所有三列返回0.00,但是当我查询视图时

Select * from myView

第三次选择返回“0”而不是 0.00。这里有什么遗漏吗?

我的错误,我在注释中输入数据类型是十进制,实际上 table1 和 table2 中的所有列 (col1,Col2,Col3) 都是“float”数据类型。 类型:浮点数,计算:无,长度:8

EXEC sp_describe_first_result_set N'SELECT * FROM myView;' 给了

Name | IsNullable | system_type_id | system_type_name |max_length|precision|scale
Col1 | 1    |62 |float  |8  |53 |0
Col2 | 1    |62 |float  |8  |53 |0
Col3 | 1    |62 |float  |8  |53 |0

【问题讨论】:

  • table1 和 table2 中的 Col1、Col2、Col3 是什么?
  • 您的Col1Col2Col3数据类型是什么?如果任何列是INT,则SQL Server 会将所有值从SELECTUNION 中的任何一个转换为INT(从而删除您的.00 ...)
  • @marc_s,由于十进制的优先级高于 int,我希望将 int 值转换为十进制而不是反之亦然。
  • @marc_s,根据联机丛书 (msdn.microsoft.com/en-us/library/ms180026.aspx),数据类型优先级规则适用于 UNION。 sp_describe_first_result_set 显示了这种行为。我猜这是显示问题。
  • @JohnyBravo,当您说 SQL only 时,您是指 SQL Server Management Studio 吗?我使用 SSMS SQL 2016 得到了预期的结果。EXEC sp_describe_first_result_set N'SELECT * FROM myview;' 的结果是什么?

标签: sql sql-server


【解决方案1】:

由于SQL Server Books Online 中记录的数据类型优先规则,UNION 返回的数据类型为float。但是,由应用程序来呈现带或不带小数的值。对于 .NET 应用程序,您可以指定格式字符串以实现一致的显示格式。

CREATE TABLE table1
    (
      col1 float
    , col2 float
    , col3 float
    );
CREATE TABLE table2
    (
      col1 float
    , col2 float
    , col3 float
    );
CREATE TABLE table3
    (
      col1 decimal(12, 2)
    , col2 decimal(12, 2)
    , col3 decimal(12, 2)
    );
INSERT  INTO dbo.table1
VALUES  ( 1.1, 0, 0 );
INSERT  INTO dbo.table3
VALUES  ( 0, 0, 0 );
GO

CREATE VIEW myview AS
    SELECT Col1, Col2, Col3 FROM table1
    UNION
    SELECT Col1, Col2, Col3 FROM table2
    UNION
    SELECT 0.00 As Col1, 0.00 As Col2, 0.00 As Col3 FROM table3;
GO

--shows 0 and 1.1
SELECT * FROM myview;

--shows float for result types
EXEC sp_describe_first_result_set N'SELECT * FROM myview;';
GO

【讨论】:

  • 在应用程序端我可以管理,但我想知道为什么 Sql 没有返回 0.00,即使我使用 CAST
  • 这是否意味着我们不会从 sql 端得到 '0.00'
  • SQL 以本机(二进制)格式返回浮点值。该值必须转换为字符串以进行表示,这完全取决于应用程序代码。 SSMS 喜欢抑制零浮点值的小数点和无关紧要的零,这是 AFAIK 不可配置的。但在您的 .NET 代码中,您可以使用 yourFloat.ToString("0.00") 或类似的方法来显示小数。
【解决方案2】:

请提供表一和表二的数据类型。

当你对多个表进行 UNION 时,它会从左到右合并表。

如果table1和table2的Col1、Col2、Col3的数据类型为整数,则

你会得到整数形式的结果。

如果您想要在第一个查询中得到的结果,则按如下方式创建视图

Create view myView
As
Begin
    Select 0.00 As Col1, 0.00 As Col2, 0.00 As Col3 from table3
    Union
    Select Col1, Col2, Col3 from table1
    Union
    Select Col1, Col2, Col3 from table2

End

【讨论】:

  • 对于 table1 中的 col1,我得到的值为 3.672
  • 是的,我明白,优先权会发生,但我不确定这里发生了什么
  • 将第三个选择放在首位,也返回 '0',而不是 '0.00'。
  • 你能试试这样的选择 CAST(0.00 as decimal(18,2)) As Col1, CAST(0.00 as decimal(18,2)) As Col2, CAST(0.00 as decimal(18) ,2)) 作为来自 table3 的 Col3 。 Coz 0.00 被视为整数并四舍五入为 0。如果您明确转换为小数,您可能会克服这个问题
  • 使用 CAST(0.00 as decimal(18,2)) As Col1 后仍然没有得到预期的结果
猜你喜欢
  • 1970-01-01
  • 2016-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多