SQL Server:双表插入数据并按条件生成PriceCode
嘿,我来帮你搞定这个插入逻辑的需求!结合你提到的ProductMst和PriceMst两张表,咱们可以用存储过程来实现这个带条件的插入规则,调用起来也方便。先理清楚表的核心结构(你可以根据实际表字段调整),然后一步步来实现:
解决方案实现
1. 假设表结构
先明确两张表的核心字段(如果你的实际表字段有差异,对应修改就行):
-- 产品主表 ProductMst CREATE TABLE ProductMst ( ProductCode VARCHAR(20) PRIMARY KEY, -- 主产品编码,比如FP-001 ProductName VARCHAR(100) NOT NULL, BasePrice DECIMAL(10,2) NOT NULL, -- 基准单价(按1kg计算) CreateDate DATETIME DEFAULT GETDATE() ); -- 价格主表 PriceMst CREATE TABLE PriceMst ( PriceCode VARCHAR(25) PRIMARY KEY, -- 价格编码,比如FP-001-01 ProductCode VARCHAR(20) FOREIGN KEY REFERENCES ProductMst(ProductCode), Weight VARCHAR(10) NOT NULL, -- 重量规格:1kg、750g、500g、250g UnitPrice DECIMAL(10,2) NOT NULL, -- 对应规格的单价 CreateDate DATETIME DEFAULT GETDATE() );
2. 编写存储过程实现插入逻辑
咱们写一个存储过程,接收产品的基本信息,先插入ProductMst的单条记录,再根据基准单价判断要插入PriceMst的记录数:
CREATE PROCEDURE InsertProductAndPrice @ProductCode VARCHAR(20), @ProductName VARCHAR(100), @BasePrice DECIMAL(10,2) AS BEGIN SET NOCOUNT ON; -- 第一步:插入ProductMst单条记录 INSERT INTO ProductMst (ProductCode, ProductName, BasePrice) VALUES (@ProductCode, @ProductName, @BasePrice); -- 第二步:根据基准单价判断插入PriceMst的记录 IF @BasePrice > 300 BEGIN -- 生成四个规格的价格记录,按重量比例计算单价 INSERT INTO PriceMst (PriceCode, ProductCode, Weight, UnitPrice) VALUES (CONCAT(@ProductCode, '-01'), @ProductCode, '1kg', @BasePrice), (CONCAT(@ProductCode, '-02'), @ProductCode, '750g', @BasePrice * 0.75), (CONCAT(@ProductCode, '-03'), @ProductCode, '500g', @BasePrice * 0.5), (CONCAT(@ProductCode, '-04'), @ProductCode, '250g', @BasePrice * 0.25); END ELSE BEGIN -- 单价低于300时,仅插入一条默认规格的记录(这里默认1kg,你可以按需调整) INSERT INTO PriceMst (PriceCode, ProductCode, Weight, UnitPrice) VALUES (CONCAT(@ProductCode, '-01'), @ProductCode, '1kg', @BasePrice); END END
3. 调用存储过程示例
比如插入一个单价超过300的产品:
EXEC InsertProductAndPrice 'FP-001', '高端烘焙咖啡豆', 450.00;
执行后,ProductMst会新增一条FP-001的记录,PriceMst则会生成FP-001-01到FP-001-04四条对应不同重量规格的价格记录。
再插入一个单价低于300的产品:
EXEC InsertProductAndPrice 'FP-002', '原味花草茶包', 280.00;
这时候PriceMst只会生成FP-002-01这一条记录。
几个注意点
- 如果你的单价计算不是按重量比例(比如750g有特殊定价),直接修改存储过程里的
UnitPrice计算部分就行。 - 如果PriceCode的后缀规则需要调整(比如不用-01而是其他格式),改一下
CONCAT里的后缀即可。 - 实际使用时,建议在存储过程里加个判断,检查
ProductCode是否已经存在,避免主键冲突。
内容的提问来源于stack exchange,提问作者Tushar
相关产品推荐
相关产品推荐

