CREATE TABLE faktura(
id_faktura INT NOT NULL IDENTITY(1,1),
cislo NVARCHAR(50) NOT NULL,
CONSTRAINT pk_faktura PRIMARY KEY CLUSTERED (id_faktura)
)
GO
CREATE TABLE polozka(
id_polozka INT NOT NULL IDENTITY(1,1),
id_faktura INT NOT NULL,
zbozi NVARCHAR(50) NOT NULL,
mnozstvi INT NOT NULL,
cena NUMERIC(10,2) NOT NULL,
CONSTRAINT pk_polozka PRIMARY KEY CLUSTERED (id_polozka),
CONSTRAINT fk_polozka_faktura FOREIGN KEY (id_faktura)
REFERENCES faktura(id_faktura)
)
GO
INSERT INTO faktura(cislo)
VALUES('2021001'),('2021002')
INSERT INTO polozka(id_faktura, zbozi, mnozstvi, cena)
VALUES (1,'chleba',5,100),
(1,'rohlik',5,10),
(2,'cukr',1,10),
(2,'olej',2,50)
GO
CREATE TYPE tt_polozka AS TABLE(
zbozi NVARCHAR(50) NOT NULL,
mnozstvi INT NOT NULL,
cena NUMERIC(10,2) NOT NULL
)
GO
CREATE PROCEDURE p_aktualizuj_polozky_faktury
@id_faktura INT,
@polozky tt_polozka READONLY
AS
BEGIN
MERGE INTO polozka p
USING (
SELECT f.id_faktura, p.zbozi, p.mnozstvi, p.cena
FROM faktura f
CROSS JOIN @polozky p
WHERE f.id_faktura = @id_faktura
)zdroj ON zdroj.id_faktura = p.id_faktura AND zdroj.zbozi = p.zbozi
WHEN MATCHED THEN
UPDATE SET
p.mnozstvi = zdroj.mnozstvi,
p.cena = zdroj.cena
WHEN NOT MATCHED THEN
INSERT(id_faktura, zbozi, mnozstvi, cena)
VALUES(zdroj.id_faktura, zdroj.zbozi, zdroj.mnozstvi, zdroj.cena)
WHEN NOT MATCHED BY SOURCE AND p.id_faktura = @id_faktura THEN
DELETE;
END
GO
DECLARE @polozky tt_polozka
INSERT INTO @polozky
VALUES('cukr',5,50),('pivo',10,200);
SELECT *
FROM faktura f
JOIN polozka p ON f.id_faktura = p.id_faktura
EXEC p_aktualizuj_polozky_faktury
@id_faktura = 2,
@polozky = @polozky
SELECT *
FROM faktura f
JOIN polozka p ON f.id_faktura = p.id_faktura
GO
id_faktura cislo id_polozka id_faktura zbozi mnozstvi cena
----------- -------------------------------------------------- ----------- ----------- -------------------------------------------------- ----------- ---------------------------------------
1 2021001 1 1 chleba 5 100.00
1 2021001 2 1 rohlik 5 10.00
2 2021002 3 2 cukr 1 10.00
2 2021002 4 2 olej 2 50.00
id_faktura cislo id_polozka id_faktura zbozi mnozstvi cena
----------- -------------------------------------------------- ----------- ----------- -------------------------------------------------- ----------- ---------------------------------------
1 2021001 1 1 chleba 5 100.00
1 2021001 2 1 rohlik 5 10.00
2 2021002 3 2 cukr 5 50.00
2 2021002 5 2 pivo 10 200.00