SQL Server:无法保存小数位数

发布于 2025-01-29 08:18:38 字数 2883 浏览 3 评论 0 原文

我面临一个奇特的问题。我在SQL Server中有几个表,其中我正确地将几列称为 DECIMAL(18,2)

不幸的是,每当我在这些列中保存任何值时,值的右侧值不会存储或将其四舍五入为较高的倍数,而该值的值则是00的右侧值。

我通过我已经为相关参数声明了此类列的小数数据类型的存储过程。

有什么问题?

编辑:发布表脚本

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     

I am facing a peculiar problem. I have a few tables in SQL Server where I have properly declared a few columns as decimal(18, 2).

Unfortunately, whenever, I save any value in these columns, either the values to the right of the value are not stored or are rounded off to the higher multiple and the value to the right of the decimal remains at 00.

I save these values through stored procedures where I have declared the decimal data type for such columns for the relevant parameters.

What could be the issue?

EDIT: posting the table script

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]

The stored procedure:

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     

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

神经大条 2025-02-05 08:18:38

类型的参数十进制等于小数(18,0)

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

这是没有小数点后的任何数字!

对于数据类型,您还需要明确 - 对于参数也是如此!

因此,您需要使用十进制(18,2)作为存储过程参数的数据类型 - 然后您将能够存储分数小数值的值!

请参阅 SQL Server中的 DECIMAL 上的官方MS文档有关更多详细信息。

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

十进制[(p [,s])]

p(precision)
要存储的最大十进制数字总数。该数字包括小数点的左侧和右侧。精度必须为1到38的最大精度。默认精度为18

s(比例)
位于小数点右侧的小数位数的数量。从P中减去该数字,以确定小数点左侧的最大数字数量。比例必须是从0到p的值,并且只有指定精度才能指定。 默认比例为0 ,因此0< = s< = p。最大存储大小各不相同,根据精度。

Parameter of type DECIMAL is equal to DECIMAL(18,0):

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

This is WITHOUT any digits after the decimal point!!

You need to be explicit about your datatype - for the parameters as well !

So you need to use DECIMAL(18,2) as the datatype for your stored procedure parameters - THEN you will be able to store fractional decimal values just fine!

See the official MS documentation on DECIMAL in SQL Server for more details.

This is from the official docs (my highlights):

decimal[ (p[ ,s] )]

p (precision)
The maximum total number of decimal digits to be stored. This number includes both the left and the right sides of the decimal point. The precision must be a value from 1 through the maximum precision of 38. The default precision is 18.

s (scale)
The number of decimal digits that are stored to the right of the decimal point. This number is subtracted from p to determine the maximum number of digits to the left of the decimal point. Scale must be a value from 0 through p, and can only be specified if precision is specified. The default scale is 0 and so 0 <= s <= p. Maximum storage sizes vary, based on the precision.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文