Buonasera a tutti,
provo a chiedere lumi per questo problema che non riesco a risolvere.
NECESSITÁ: mi ritrovo a dover ricostruire un listino prezzi per ciascun cliente, partendo da un numero variabile di "micro listini". Non posso purtroppo creare un'associazione diretta 1-M tra clienti e listini.
TENTATIVO: Ho quindi optato per l'utilizzo di una istruzione MERGE, generando i dati di partenza con una CTE. Di seguito lo script:
[CODE]DECLARE @Id_RevPartenza as int,
@Promo as int,
@DataValidita as datetime
SET @Id_RevPartenza = 2796 -- 2597 = Promo Tubo 0 | 2720 = Promo 2
-- 2790 = Promo FGS | 2796 = Promo nipli
SET @Promo = 23 -- 24 = Promo 0 tubo | 26 = Promo 2 tubo
-- 22 = Promo FGS | 23 = Promo Nipli
SET @DataValidita = '20220502'
--Creo la cte con i prezzi di partenza
;WITH PrezziPromo AS(
SELECT Cd_AR, Prezzo, Sconto
FROM LSArticolo
WHERE Id_LSRevisione = @Id_RevPartenza)
--Creo i dati che da aggiornare/inserire
, src as (
Select L.Id_LSRevisione, PP.Cd_AR, PP.Prezzo, PP.Sconto
From CFCliCFCliAttributo A
Inner Join CF on CF.Cd_CF = A.Cd_CF
Inner Join LSEx(@DataValidita) L On L.Cd_LS = CF.Cd_LS_1
Cross join PrezziPromo PP
Where Id_Attributo = @Promo And L.Avanzato = 1)
-- Test intermedio per verifica dei dati che verranno immessi
-- SELECT * FROM src
MERGE LSArticolo AS tgt
USING src
ON (tgt.Id_LSRevisione = src.Id_LSRevisione AND tgt.Cd_AR = src.Cd_AR)
WHEN MATCHED THEN
UPDATE SET tgt.Prezzo = src.Prezzo, tgt.Sconto = src.Sconto
WHEN NOT MATCHED BY TARGET THEN
INSERT (Id_LSRevisione, Cd_AR, Prezzo, Sconto)
VALUES (src.Id_LSRevisione, src.Cd_AR, src.Prezzo, src.Sconto);
Quasi tutto funzionante. L'inserimento e l'aggiornamento dei dati procede regolarmente. Ma per gestire il caso in cui un prezzo venga cancellato dal micro listino, ho tentato di aggiungere la clausola
WHEN NOT MATCHED BY SOURCE THEN
DELETE;
sperando di eliminare dalla tabella target un dato che in tabella source non c'è più. Purtroppo l'elaborazione diventa interminabile (a 30 secondi di esecuzione ho interrotto... Senza l'ultima clausola, lo script impiega mezzo secondo abbondante ad allineare le tabelle).
Ho impostato male lo script e non me ne accorgo, o devo per forza migrare sulle istruzioni esplicite come nell'