Zählen Sie die mehreren Zeilen in einem Trigger mit mehreren Updates auf

Nov 19 2020

Ich habe so etwas wie die folgende Tabelle:

CREATE TABLE updates (
    id INT PRIMARY KEY IDENTITY (1, 1),
    name VARCHAR (50) NOT NULL,
    updated DATETIME
);

Und ich aktualisiere es so:

INSERT INTO updates (name, updated)
VALUES
    ('fred', '2020-11-11),
    ('fred', '2020-11-11'),
    ...
    ('bert', '2020-11-11');

Ich muss einen After-Update-Trigger schreiben und alle hinzugefügten Namen auflisten und sie jeweils einer anderen Tabelle hinzufügen, kann aber nicht herausfinden, wie sie jeweils aufgelistet werden.

EDIT: - Dank derer, die mich in die richtige Richtung gelenkt haben, kenne ich sehr wenig SQL.

Was ich tun muss, ist so etwas

  • foreach Name in eingefügt
  • schau es in einer anderen Tabelle nach und
  • Rufen Sie eine Anzahl der Aktualisierungen ab, die ein 'Name' durchgeführt hat
  • addiere 1 zur Zählung
  • und aktualisieren Sie es wieder in die andere Tabelle

Ich kann momentan nicht an meinen Laptop gelangen, aber vermutlich kann ich so etwas tun:

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

und das würde für jeden Namen im Update funktionieren?

Natürlich muss ich mich über die satzbasierte SQL-Verarbeitung informieren.

Vielen Dank für die Hilfe und Hinweise.

Antworten

LukaszSzozda Nov 19 2020 at 20:13

Verwendung insertedund satzbasierter Ansatz (keine Schleife erforderlich):

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

Basierend auf Ihren Änderungen würden Sie Folgendes tun ... set based ist eine Denkweise, sodass Sie die Anzahl nicht im Voraus berechnen müssen (tatsächlich können Sie dies nicht). Es ist nicht klar, ob Sie in derselben oder einer anderen Tabelle zählen - aber ich bin sicher, Sie können es herausfinden.

Punkte:

  • Verwenden Sie die Tabelle Einfügen, um zu bestimmen, welche Zeilen aktualisiert werden sollen
  • Verwenden Sie eine Unterabfrage, um den neuen Wert zu berechnen, wenn es sich um eine zweite Tabelle handelt, wobei die Möglichkeit von Null berücksichtigt wird

Wenn Sie wirklich dieselbe Tabelle verwenden, sollte dies funktionieren

BEGIN
    UPDATE OTHERTAB SET
      UCount = COALESCE(UCount,0) + 1 
    WHERE [name] in (
        SELECT I.[name]
        FROM Inserted I
    );
END;

Wenn Sie jedoch eine zweite Tabelle verwenden, sollte dies funktionieren:

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;