На вашем месте я бы сначала попытался исправить данные, а затем изменить процедуру только на INSERT
или UPDATE
. Например, следующий код должен это сделать (но, пожалуйста, сначала проверьте его):
WITH DataSource AS
(
SELECT Customer
,Material
,Component
,SUM(ISNULL(quantity, 0)) OVER (PARTITION BY Customer, Material, Component) AS [OveralQty]
,ROW_NUMBER() OVER (PARTITION BY Customer, Material, Component ORDER BY (SELECT 1)) AS [RowID]
FROM [SAP_Mat_WhereUse]
)
SELECT *
INTO #DataSource
FROM DataSource
WHERE [RowID] = 1;
TRUNCATE TABLE [SAP_Mat_WhereUse];
INSERT INTO [SAP_Mat_WhereUse]
SELECT *
FROM #DataSource;
Затем вы можете изменить свою процедуру следующим образом:
ALTER PROCEDURE [dbo].[Proc_SAP_Mat_InsertWhereUse]
(@cust varchar(10),
@materials varchar(15),
@Comp varchar(20),
@qty int)
AS
BEGIN;
SET NOCOUNT ON;
IF EXISTS
(
SELECT 1
FROM [SAP_Mat_WhereUse]
WHERE Material = @materials
AND Component = @Comp
AND Customer = @cust
)
BEGIN
UPDATE [SAP_Mat_WhereUse]
SET Quantity = @qty
WHERE Material = @materials
AND Component = @Comp
AND Customer = @cust;
END
ELSE
BEGIN
INSERT INTO SAP_Mat_WhereUse (Customer, Material, Component, Quantity)
VALUES (@cust, @materials, @Comp, @qty);
END
END
Конечно, в зависимости от в зависимости от размера данных вы не сможете исправить данные в одном и предпочитаете делать это постепенно.
Вы можете применить то же исправление, но для определенных строк:
WITH DataSource AS
(
SELECT Customer
,Material
,Component
,SUM(ISNULL(quantity, 0)) OVER () AS [OveralQty]
,ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS [RowID]
FROM [SAP_Mat_WhereUse]
WHERE Customer = @cust
AND Material = @materials
AND Component = @comp
)
SELECT *
INTO #DataSource
FROM DataSource
WHERE [RowID] = 1;
DELETE FROM [SAP_Mat_WhereUse]
WHERE Customer = @cust
AND Material = @materials
AND Component = @comp
INSERT INTO [SAP_Mat_WhereUse]
SELECT Customer
,Material
,Component
,[OveralQty] + qty
FROM #DataSource;
или (потому что есть много вариантов сделать это) - вы можете просто sum(quantity)
в своем текущем коде, сохранить его в переменной и затем добавить его.