我有两个表Price List
和Price Code
:
CREATE TABLE PriceLists
(
PriceListID INT IDENTITY(1,1) NOT NULL,
Reference NVARCHAR(50) NOT NULL,
Description NVARCHAR(255) NOT NULL
)
每个Price List
都有很多价格代码:
CREATE TABLE PriceCodes
(
PriceCodeID INT IDENTITY(1,1) NOT NULL,
PriceListID INT NOT NULL
PriceCodeName NVARCHAR(50) NOT NULL
)
基本上我需要一个存储过程;输入新的价格清单后,该存储过程将使用新的PriceCodes
向PriceListID
表中添加相同数量的价格代码。
例如:
如果使用PriceList
和PriceListID = 1
将新行插入Reference = 2017
表中,则存储过程应将这些行插入PriceCode
表中:
PriceCodeID PriceListID PriceCodeName
------------------------------------------
1 1 CodeA
2 1 CodeB
3 1 CodeC
如果我们在PriceList
表中有此数据:
PriceListID Reference
------------------------
1 2017
1 2018
然后PriceCodse
表应如下所示:
PriceCodeID PriceListID PriceCodeName
------------------------------------------
1 1 CodeA
2 1 CodeB
3 1 CodeC
4 2 CodeA
5 2 CodeB
6 2 CodeC
答案 0 :(得分:1)
您可以轻松地将其打包到AFTER INSERT
触发器中,甚至摆脱那个丑陋的光标-尝试以下操作:
CREATE TRIGGER trg_InsertPriceCodes
ON dbo.PriceLists
AFTER INSERT
AS
BEGIN
INSERT INTO dbo.PriceCodes (PriceListID, PriceCodeName)
SELECT i.PriceListID, VAL.Name
FROM Inserted i
CROSS APPLY (VALUES ('CodeA'), ('CodeB'), ('CodeC')) AS VAL(Name)
END
因此,现在,每当您在PriceLists
中插入一行时,触发器都将为{分别添加值CodeA
,CodeB
和CodeC
的三行{1}}到PriceCodeName
表中。不需要存储过程,也不需要RBAR(逐行)。
答案 1 :(得分:0)
我写了这段代码,它看起来很有效,只需要很少的调整。
SET NOCOUNT ON;
DECLARE @priceCodeName VARCHAR(50), @PriceListID INT, @PriceGroup VARCHAR(20);
DECLARE priceCode_cursor CURSOR FOR
SELECT PriceCodeName ,PriceListID ,PriceGroup
FROM PriceCodes2
ORDER BY PriceCodeName;
OPEN priceCode_cursor
FETCH NEXT FROM priceCode_cursor
INTO @priceCodeName, @PriceListID, @PriceGroup
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO [dbo].[PriceCodes2]
([PriceCodeName]
,[PriceListID]
,[PriceGroup])
VALUES
(@priceCodeName,@PriceListID,@PriceGroup)
FETCH NEXT FROM priceCode_cursor
INTO @priceCodeName, @PriceListID, @PriceGroup
END
CLOSE priceCode_cursor;
DEALLOCATE priceCode_cursor;