Comment puis-je obtenir un déclencheur sur chaque ligne insérée lors d'une INSERTION DANS la Table ( ... ) SELECT * from Table2?

J'ai essayé d'éviter l'utilisation d'un curseur dans ce cas particulier, juste parce que je n'aime pas les compromis, et il arrive, je m'y suis fait à l'aide de déclencheurs ressembler à la bonne marche de l'action, de toute façon.

Une procédure stockée insère un enregistrement à partir d'un mélange complexe de clauses, à l'aide d'un déclencheur d'insertion-je envoyer un e-mail à l'utilisateur cible de leur dire de la visite d'un site. C'est facile et fonctionne très bien.

Cependant, une autre procédure consiste à exécuter tous les soirs, et de redistribuer tous les non-visualisation des enregistrements. La façon dont je le faisais c'était de faire un autre insert basé sur un select sur un champ de date à partir de quand il a été affecté. À savoir:

INSERT INTO Table (ID, User, AssignDate, LastActionDate)
    SELECT 
        ID
        ,User
        ,GETDATE() [AssignDate]
        ,GETDATE() [LastModifiedDate]
    FROM Table2
        /*snip*/

Le déclencheur fonctionne sur les différents inserts, mais l'instruction select ci-dessus ne fonctionne que sur la dernière ligne insérée. Est-il un moyen de contourner ce problème? Il ruine toute chose!

Modifier (code du déclencheur):

ALTER TRIGGER dbo.Notify
    ON  dbo.Table
    AFTER INSERT
AS 
BEGIN

    DECLARE @EmailSender varchar(50)='Sender Profile'
    DECLARE @Identity int
    DECLARE @User varchar(20)
    DECLARE @Subject varchar(50)

    SET @Identity=@@Identity

    SELECT @User=User, @Subject='(' + CONVERT(varchar,@Identity) + ')!'
    FROM Table
    WHERE
        idNum=@Identity

    exec msdb.dbo.sp_send_dbmail
        @profile_name=@EmailSender,
        @recipients=@User
        @subject=@Subject,
        @body='//etc'

END
Les déclencheurs dans SQL Server feu une fois par déclaration, pas une fois par ligne. Si vous avez besoin d'écrire votre code de déclencheur pour faire face à de multiples lignes existant dans inserted et/ou deleted. Habituellement, cela peut être fait sans avoir recours à des curseurs. Mais nous aurions besoin de voir plus de code pour informer - tout ce que vous avez montré pour le moment est un standard de l'instruction insert.
Ajouté dans le code du déclencheur.
Je pense que vous aurez besoin d'un curseur pour cela. Je ne pense pas qu'il y a quelque chose de prévu pour vous permettre d'insérer de multiples e-mails en une seule fois.
Vous ne devez pas utiliser @@identity, vous utilisez le champ id de l'inséré pseudotable. En fait, vous avez presque ne faut jamais utiliser @@identity dans tout le processus comme il peut renvoyer le worng résultats et le désordre de notre intégrité des données.
Bauer - Donc, si un 100 lignes sont insérées dans un seul énoncé, vous voulez 100 e-mails envoyés? Je suis désolé pour ces bénéficiaires.

OriginalL'auteur C Bauer | 2011-04-27