SQL十进制值作为int插入

MAW*_*656 4 sql t-sql sql-server

我正在运行一个返回小数的查询,然后将这些小数插入表变量.当我查询表变量时,我得到整数.任何人都可以看到为什么会发生这种情况以及如何纠正?使用Sql Server 2000.

DECLARE @Nov Table(custCode varchar(10), PromiseAvg decimal, ShipAvg decimal )

INSERT INTO @Nov
SELECT  JM.CustomerCode
  , isnull(AVG(Cast(DATEDIFF(dd, ISNULL(startDate, 0), ISNULL(PromiseDate, 0)) As Decimal)),0) As PromiseAvg
  , isnull(AVG(Cast(DATEDIFF(dd, ISNULL(startDate, 0), ISNULL(BOL.ShipDate, 0)) As Decimal)),0) As ShipAvg
from jobitems JI
LEFT JOIN jobmaster JM ON JI.Job_Number = JM.JobNumber
LEFT JOIN dbo.NCL_BOLDetails BD ON JM.JobNumber = BD.JobNumber AND JI.Item_Code = BD.ItemNumber
INNER JOIN dbo.NCL_BOLs BOL ON BD.BOLID = BOL.BOLID
WHERE StartDate BETWEEN '20091101' AND '20091130'    
Group By JM.CustomerCode, JM.CustLongName
Order By JM.CustomerCode

Select * from @Nov
Run Code Online (Sandbox Code Playgroud)

Mar*_*ith 6

您需要在表变量中定义小数的比例和精度.

例如

DECLARE @Nov TABLE(
custCode VARCHAR(10), 
PromiseAvg decimal(18,8), 
ShipAvg decimal(18,8) )
Run Code Online (Sandbox Code Playgroud)

或任何适合您的规模和精度.我刚刚在SQL Server 2008上进行了测试,decimal(18,0)如果未在create table语句中指定,它看起来就像是默认值.

也和你的casts一样

... 
isnull(AVG(Cast(DATEDIFF(dd, ISNULL(startDate, 0), ISNULL(PromiseDate, 0)) 
As decimal(18,8))),0) As PromiseAvg,
....
Run Code Online (Sandbox Code Playgroud)