sql-server - SQL Server : 无法保存 decimal 位

我面临一个特殊的问题。我在 SQL Server 中有几个 tables,我已经正确地将一些列声明为 decimal(18, 2)

不幸的是,每当我在这些列中保存任何 value 时,都不会存储 value 右侧的 values 或四舍五入到更高的倍数,而 decimal 右侧的 value > 保持在 00。

我通过存储过程保存这些 values ,其中我为相关参数声明了此类列的 decimal 数据类型。

可能是什么问题?

编辑:发布 table 脚本

CREATE TABLE [dbo].[ItemMaster]
(
    [ColIndex] [int] IDENTITY(1,1) NOT NULL,
    [ItemName] [nvarchar](150) NULL,
    [ItemBrand] [int] NULL,
    [ItemHSN] [nvarchar](50) NULL,
    [ItemSalePrice] [decimal](18, 2) NULL,
    [ItemCode] [nvarchar](50) NULL,
    [ItemBarcode] [nvarchar](max) NULL,
    [ItemQRCode] [nvarchar](max) NULL,
    [ItemUnit] [int] NULL,
    [ItemOpeningStock] [int] NULL,
    [ItemCreationDate] [datetime] NULL,
    [ItemEditDate] [datetime] NULL,
    [ItemCreationUserID] [int] NULL,
    [ItemEditUserID] [int] NULL,
    [ItemActiveStatus] [int] NULL,
    [PurCGST] [decimal](10, 3) NULL,
    [PurSGST] [decimal](10, 3) NULL,
    [PurIGST] [decimal](10, 3) NULL,
    [SaleCGST] [decimal](10, 3) NULL,
    [SaleSGST] [decimal](10, 3) NULL,
    [SaleIGST] [decimal](10, 3) NULL,
    [ItemCat] [int] NULL,
    [RandomString] [nvarchar](50) NULL,

    CONSTRAINT [PK_ItemMaster] 
        PRIMARY KEY CLUSTERED ([ColIndex] ASC)
                    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
                          IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
                          ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

存储过程:

CREATE OR ALTER PROCEDURE [dbo].[EditItem]
    @ItemColID BIGINT,
    @ItemName NVARCHAR(150),
    @ItemBrandNum INT,
    @ItemHSN NVARCHAR (150),
    @SalePrice DECIMAL,
    @ItemCode NVARCHAR(150),
    @ItemBarcode NVARCHAR(500),
    @ItemQRCode NVARCHAR(500),
    @ItemUnitNum INT,
    @ItemOpeningStock INT,
    -- @ItemCreateDate DATETIME,
    @ItemEditDate DATETIME,
    -- @ItemCreateUserID INT,
    @ItemEditUserID INT,
    @ItemActiveStatus INT,

    -- @PurCGSTRate DECIMAL,
    -- @PurSGSTRate DECIMAL,
    -- @PurIGSTRate DECIMAL,

    @SaleCGSTRate DECIMAL,
    @SaleSGSTRate DECIMAL,
    @SaleIGSTRate DECIMAL,
    @ItemCat INT
AS
BEGIN
    SET NOCOUNT ON;

    UPDATE ItemMaster 
    SET ItemName = @ItemName ,
        ItemBrand = @ItemBrandNum, 
        ItemHSN = @ItemHSN,
        ItemSalePrice = @SalePrice,
        ItemCode = @ItemCode,
 ItemBarcode =      @ItemBarcode ,
ItemQRCode =    @ItemQRCode ,
ItemUnit =  @ItemUnitNum ,
  ItemOpeningStock=   @ItemOpeningStock ,
  --  @ItemCreateDate 
   ItemEditDate = @ItemEditDate ,
   -- @ItemCreateUserID 
ItemEditUserID = @ItemEditUserID ,
   ItemActiveStatus =  @ItemActiveStatus,

--  purcgst=@PurCGSTRate ,
--pursgst=@PurSGSTRate ,
--purigst=@PurIGSTRate,

salecgst= @SaleCGSTRate ,
SaleSGST = @SaleSGSTRate ,
saleigst= @SaleIGSTRate, 
itemcat = @ItemCat

   WHERE ItemMaster .ColIndex = @ItemColID
END
GO

回答1

DECIMAL 类型的参数等于 DECIMAL(18,0)

@SaleCGSTRate DECIMAL,
@SaleSGSTRate DECIMAL,
@SaleIGSTRate DECIMAL,

这是在 decimal 点之后没有任何数字!

您需要明确您的数据类型 - 参数也是如此!

因此,您需要使用 DECIMAL(18,2) 作为存储过程参数的数据类型 - 那么您将能够 store 小数 decimal values 就好了!

有关详细信息,请参阅 SQL Server 中 DECIMALhttps://docs.microsoft.com/en-us/sql/t-sql/data-types/decimal-and-numeric-transact-sql?view=sql-server-ver15

这是来自官方文档(我的亮点):

decimal[ (p[ ,s] )]

p (precision)

要存储的 decimal 位的最大总数。此数字包括 decimal 点的左侧和右侧。精度必须是从 1 到最大精度 38 的 value。默认精度为 18。

s (scale)

decimal 位数存储在 decimal 点的右侧。从 p 中减去该数字以确定 decimal 点左侧的最大位数。比例尺必须是从 0 到 p 的 value,并且只有在指定精度时才能指定。默认比例为 0,因此 0 <= s <= p。最大存储大小因精度而异。

相似文章

随机推荐

最新文章