Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server视图返回0.00_Sql_Sql Server - Fatal编程技术网

SQL Server视图返回0.00

SQL Server视图返回0.00,sql,sql-server,Sql,Sql Server,我有三个选择: 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

我有三个选择:

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。这里少了什么

我的错误是,我在注释中输入了数据类型是decimal,实际上表1和表2中的所有列(col1、Col2、Col3)都有“float”数据类型。 类型:浮动,计算:否,长度:8

EXEC sp_description_first_result_set N'SELECT*FROM myView;' 给予


请提供表1和表2的数据类型

当您合并多个表时,它将从左到右合并表

如果表1和表2的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

请提供表1和表2的数据类型

当您合并多个表时,它将从左到右合并表

如果表1和表2的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

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

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


表1和表2中的Col1、Col2、Col3是什么?您的
Col1
Col2
Col3
的数据类型是什么??如果任何列是
INT
,那么SQL Server将把
SELECT
ni的所有值从
UNION
转换为
INT
(从而删除
.00
…)@marc\s,因为十进制的优先级高于INT,我希望int值转换为十进制,而不是visa十进制。@marc_s,根据Books Online(),数据类型优先规则适用于UNION。sp_descripe_first_result_集显示此行为。我猜这是一个显示问题。@JohnyBravo,当你说
SQL only
,你是说sqlserver管理工作室吗?我使用SSMS SQL 2016获得了预期的结果。
EXEC sp\u description\u first\u result\u set N'SELECT*FROM myview;'
?表1和表2中的Col1、Col2、Col3是什么?您的
Col1
Col2
Col3
的数据类型是什么??如果任何列是
INT
,那么SQL Server将把
SELECT
ni的所有值从
UNION
转换为
INT
(从而删除
.00
…)@marc\s,因为十进制的优先级高于INT,我希望int值转换为十进制,而不是visa十进制。@marc_s,根据Books Online(),数据类型优先规则适用于UNION。sp_descripe_first_result_集显示此行为。我猜这是一个显示问题。@JohnyBravo,当你说
SQL only
,你是说sqlserver管理工作室吗?我使用SSMS SQL 2016获得了预期的结果。
EXEC sp\u description\u first\u result\u set N'SELECT*FROM myview;'?对于表1中的col1,我得到的值是3.672是的,我知道会发生优先级,但我不确定会发生什么。在第一位的第三个select中,也会返回“0”,而不是“0.00”。您可以尝试类似这样的选择转换(0.00作为十进制(18,2))作为col1,转换(0.00作为十进制(18,2))作为Col2,转换吗(0.00作为十进制(18,2))作为表3中的Col3。因为0.00被视为整数并四舍五入为0。如果显式转换为十进制,则可能会克服此问题。使用cast(0.00作为十进制(18,2))后将无法获得预期结果正如表1中col1的col1,我得到的值是3.672是的,我知道会发生优先级,但我不确定会发生什么。在第一位的第三个选择中,也会返回“0”,而不是“0.00”。您可以尝试类似这样的选择转换(0.00作为十进制(18,2))作为col1,转换(0.00作为十进制(18,2))作为Col2,转换吗(0.00作为十进制(18,2))作为表3中的Col3。因为0.00被视为整数并四舍五入为0。如果显式转换为十进制,则可能会克服此问题。使用cast(0.00作为十进制(18,2))后将无法获得预期结果作为应用程序端的col1,我可以管理,但我想知道为什么Sql不返回0.00,即使在我使用cast时,这是否意味着我们不会从Sql端获取“0.00”Sql正在以本机(二进制)返回浮点值格式。值必须转换为字符串才能显示,这完全取决于应用程序代码。SSMS喜欢抑制小数点和零浮点值的不重要零,这是不可配置的。但在.NET代码中,您可以使用
yourFloat.ToString(“0.00”)
或类似于显示小数。在应用程序端,我可以管理,但我想知道为什么Sql不返回0.00,即使在我使用Cast时,这是否意味着我们不会从Sql端获得“0.00”。Sql返回的浮点值是本机(二进制)的格式。值必须转换为字符串才能显示,这完全取决于应用程序代码。SSMS喜欢抑制小数点和零浮点值的不重要零,这是不可配置的。但在.NET代码中,您可以使用
yourFloat.ToString(“0.00”)
或类似选项以显示小数。