4

两个查询的结果应该相同。相同的数据。相同的公式。一样的演员。一个结果是在查询中针对表变量计算的,而第二个结果是针对变量计算的。我已经用临时表和永久表替换了表变量,结果相同。

为什么我的结果不同?

DECLARE
    @comm DECIMAL(20 , 6)
  , @quantity INT
  , @multiplier INT
  , @price DECIMAL(38 , 10)

SET @comm = 210519.749988;
SET @quantity = 360000;
SET @multiplier = 1;
SET @price = 167.0791666666;

DECLARE @t AS TABLE
    (
      [comm] [decimal](38 , 6)
    , [multiplier] [int]
    , [Quantity] [int]
    , [Price] [decimal](38 , 10)
    )

INSERT INTO @t
    VALUES
        ( @comm , @quantity , @multiplier , @price )

SELECT
        @comm = comm
      , @quantity = quantity
      , @multiplier = multiplier
      , @price = price
    FROM
        @t

SELECT
        CAST(comm / quantity / multiplier / price AS DECIMAL(32 , 10))
    FROM
        @t
UNION ALL
SELECT
        CAST(@comm / @quantity / @multiplier / @price AS DECIMAL(32 , 10));

结果

1. 0.0034990000
2. 0.0035000000

针对不同服务器的相同结果。SQL Server 2008 R2 Web 版、Standard 和 Express 以及 SQL Server 2012 Standard。

4

3 回答 3

5

差异是由于您的两个DECIMAL字段的精度不同:

将@comm 更改为(38,6)

DECLARE
    @comm DECIMAL(38 , 6)
  , @quantity INT
  , @multiplier INT
  , @price DECIMAL(38 , 10)

我得到:

---------------------------------------
0.0034990000
0.0034990000

同样改变commto@t[comm] [decimal](20 , 6)我:

---------------------------------------
0.0035000000
0.0035000000

如果字段一致,则结果将一致。

于 2013-08-28T22:15:42.847 回答
4

@comm定义为小数(20,6),而comm列是小数(38,6)。您还为 @comm 分配了一个小数点后 7 位的值,它最多只能接受 6 位小数

根据文档,精度在 20-28 之间的小数占用 13 个字节,而较大的小数使用 17 个字节。当您SELECT将较大的值存储comm回较小的@comm变量时,必然会发生一些舍入。

于 2013-08-28T22:18:35.370 回答
0

在使用字段的选择和使用内存中变量的选择之间,您的数据类型到输出数据类型的隐式转换听起来好像有所不同。

在对不同数据类型的变量/字段执行数学运算时,建议CAST它们首先对输出(或相同的中间)数据类型。

在这种情况下,您的问题可能是因为DECLARE @comm DECIMAL(20 , 6),它与您的输出类型的精度不同DECIMAL(32, 10)

于 2013-08-28T22:20:41.270 回答