Énumérer les plusieurs lignes dans un déclencheur multi-mise à jour
J'ai quelque chose comme le tableau ci-dessous:
CREATE TABLE updates (
id INT PRIMARY KEY IDENTITY (1, 1),
name VARCHAR (50) NOT NULL,
updated DATETIME
);
Et je le mets à jour comme ceci:
INSERT INTO updates (name, updated)
VALUES
('fred', '2020-11-11),
('fred', '2020-11-11'),
...
('bert', '2020-11-11');
J'ai besoin d'écrire un déclencheur de mise à jour après et d'énumérer tous les noms qui ont été ajoutés et d'ajouter chacun à une autre table mais je ne peux pas déterminer comment énumérer chacun.
EDIT: - grâce à ceux qui m'ont orienté dans la bonne direction, je connais très peu SQL.
Ce que je dois faire est quelque chose comme ça
- foreach nom inséré
- recherchez-le dans une autre table et
- récupérer un décompte des mises à jour effectuées par un 'nom'
- ajouter 1 au décompte
- et mettez-le à jour dans l'autre table
Je ne peux pas accéder à mon ordinateur portable pour le moment, mais je peux probablement faire quelque chose comme:
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
et cela fonctionnerait pour chaque nom dans la mise à jour?
Évidemment, je vais devoir lire sur le traitement SQL basé sur les ensembles.
Merci à tous pour l'aide et les conseils.
Réponses
Utilisation d'une insertedapproche basée sur des ensembles (pas besoin de boucle):
CREATE TRIGGER trg
ON updates
AFTER INSERT
AS
BEGIN
INSERT INTO tab2(name)
SELECT name
FROM inserted;
END
Sur la base de vos modifications, vous feriez quelque chose comme ce qui suit ... basé sur un ensemble est un état d'esprit, vous n'avez donc pas besoin de calculer le décompte à l'avance (en fait, vous ne pouvez pas). Il n'est pas clair si vous comptez dans la même table ou dans une autre table - mais je suis sûr que vous pouvez y arriver.
Points:
- Utilisez le tableau Inséré pour déterminer les lignes à mettre à jour
- Utilisez une sous-requête pour calculer la nouvelle valeur s'il s'agit d'une deuxième table, en tenant compte de la possibilité de null
Si vous utilisez vraiment la même table, cela devrait fonctionner
BEGIN
UPDATE OTHERTAB SET
UCount = COALESCE(UCount,0) + 1
WHERE [name] in (
SELECT I.[name]
FROM Inserted I
);
END;
Si toutefois vous utilisez une deuxième table, cela devrait fonctionner:
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;