Wylicz wiele wierszy w wyzwalaczu wielu aktualizacji
Mam coś takiego jak poniższa tabela:
CREATE TABLE updates (
id INT PRIMARY KEY IDENTITY (1, 1),
name VARCHAR (50) NOT NULL,
updated DATETIME
);
Aktualizuję to tak:
INSERT INTO updates (name, updated)
VALUES
('fred', '2020-11-11),
('fred', '2020-11-11'),
...
('bert', '2020-11-11');
Muszę napisać wyzwalacz po aktualizacji i wyliczyć wszystkie nazwy, które zostały dodane i dodać je do innej tabeli, ale nie mogę ustalić, jak je wyliczyć.
EDYCJA: - dzięki tym, którzy wskazali mi właściwy kierunek, znam bardzo mało SQL.
To, co muszę zrobić, to coś takiego
- dla każdej nazwy wstawione
- poszukaj w innej tabeli i
- pobrać liczbę aktualizacji wykonanych przez „imię”
- dodaj 1 do liczby
- i zaktualizuj go z powrotem do drugiej tabeli
W tej chwili nie mogę dostać się do swojego laptopa, ale prawdopodobnie mogę zrobić coś takiego:
BEGIN
SET @count = (SELECT UCount from OTHERTAB WHERE name = ins.name)
SET @count = @count + 1
UPDATE OTHERTAB SET UCount = @count WHERE name = ins.name
SELECT ins.name
FROM inserted ins;
END
i to będzie działać dla każdej nazwy w aktualizacji?
Oczywiście będę musiał poczytać o przetwarzaniu SQL opartym na zestawie.
Dziękuję wszystkim za pomoc i wskazówki.
Odpowiedzi
Stosowanie insertedi podejście oparte na zbiorach (nie ma potrzeby stosowania pętli):
CREATE TRIGGER trg
ON updates
AFTER INSERT
AS
BEGIN
INSERT INTO tab2(name)
SELECT name
FROM inserted;
END
Opierając się na swoich edycjach, zrobiłbyś coś podobnego do następującego ... oparty na zestawie to sposób myślenia, więc nie musisz obliczać liczby z wyprzedzeniem (w rzeczywistości nie możesz). Nie jest jasne, czy liczysz w tym samym stole, czy w innym - ale jestem pewien, że możesz to rozwiązać.
Zwrotnica:
- Użyj tabeli Wstawiona, aby określić, które wiersze mają zostać zaktualizowane
- Użyj zapytania podrzędnego, aby obliczyć nową wartość, jeśli jest to druga tabela, biorąc pod uwagę możliwość null
Jeśli naprawdę używasz tej samej tabeli, to powinno działać
BEGIN
UPDATE OTHERTAB SET
UCount = COALESCE(UCount,0) + 1
WHERE [name] in (
SELECT I.[name]
FROM Inserted I
);
END;
Jeśli jednak używasz drugiej tabeli, powinno to działać:
BEGIN
UPDATE OTHERTAB SET
UCount = COALESCE((SELECT UCount+1 from OTHERTAB T2 WHERE T2.[name] = OTHERTAB.[name]),0)
WHERE [name] in (
SELECT I.[name]
FROM Inserted I
);
END;