我面临一个特殊的问题。我在 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 中 DECIMAL
的 https://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。最大存储大小因精度而异。