Wylicz wiele wierszy w wyzwalaczu wielu aktualizacji

Nov 19 2020

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

LukaszSzozda Nov 19 2020 at 20:13

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
DaleK Nov 19 2020 at 21:04

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;