Comment supprimer toutes les lignes sans supprimer la dernière ligne renvoyée dans SQL Server?

Je souhaite supprimer toutes les lignes d'un SELECT sans supprimer la dernière ligne renvoyée en utilisant un triggersur lors de l'exécution d'une requête de suppression.

Ce triggersur ne fonctionne pas, donc toute aide est grandement appréciée.

 CREATE TRIGGER TR_StergereOfertaSpeciala ON OferteSpeciale INSTEAD OF DELETE AS DECLARE @nr INTEGER; IF (EXISTS(SELECT * FROM DELETED)) BEGIN SET @nr = (SELECT COUNT(*) FROM DELETED); DELETE FROM ( SELECT TOP(@nr - 1)* FROM OferteSpeciale INNER JOIN DELETED ON OferteSpeciale.codP = Deleted.codP AND OferteSpeciale.codM = Deleted.codM AND OferteSpeciale.dela = Deleted.dela) END 

Voici un exemple de fonctionnement de votre concept:

 CREATE TRIGGER TR_StergereOfertaSpeciala ON OferteSpeciale INSTEAD OF DELETE AS BEGIN DECLARE @nr INT SET @nr = (SELECT COUNT(*) FROM DELETED) IF (@nr > 1) BEGIN DELETE o FROM OferteSpeciale AS o INNER JOIN (SELECT TOP (@nr - 1) * FROM DELETED /* ORDER BY ??? */) AS d ON o.codP = d.codP AND o.codM = d.codM AND o.dela = d.dela END END 

Notez la syntaxe pour une suppression avec une jointure. Notez également que nous choisissons arbitrairement la ligne à conserver. Je suggère, comme @RBarryYoung l'a mentionné, de order spécifiquement l'set par quelque chose pour savoir quelle rangée nous gardons.

Une autre façon de faire cela qui pourrait éviter la clause TOP quelque peu dynamic (intelligent, BTW) serait d'exclure spécifiquement l'logging que vous voulez continuer à utiliser NOT EXISTS/IN

En outre, vous souhaiterez probablement éviter la récursivité des triggersurs et les triggersurs nesteds dans ce cas.