存储过程=>用新数据更新表

时间:2018-09-19 15:36:50

标签: sql-server stored-procedures

我有两个表Price ListPrice 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
)

基本上我需要一个存储过程;输入新的价格清单后,该存储过程将使用新的PriceCodesPriceListID表中添加相同数量的价格代码。

例如:

如果使用PriceListPriceListID = 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

2 个答案:

答案 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中插入一行时,触发器都将为{分别添加值CodeACodeBCodeC的三行{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;