5 votes

Envoyer un courriel pour chaque ligne d'un ensemble de résultats

J'aimerais envoyer un courriel pour chaque ligne d'un ensemble de résultats en utilisant sp_send_dbmail.

Quelle est la meilleure façon d'y parvenir sans utiliser de boucles ?

Edit : Je n'insiste pas sur le fait qu'une boucle n'est pas appropriée ici, mais existe-t-il un moyen basé sur un ensemble pour faire cela. J'ai essayé de créer une fonction, mais une fonction ne peut pas appeler une proc stockée à l'intérieur. Seulement un autre func ou un sp étendu (ce que je préfère ne pas faire non plus).

6voto

Quassnoi Points 191041

Ce cas est exactement ce pour quoi les boucles sont bonnes (et conçues).

Puisque vous faites des choses qui ne relèvent pas du champ d'application de la base de données, il est parfaitement légitime d'utiliser des boucles pour ces choses.

Les bases de données sont conçues pour stocker des données et effectuer des requêtes sur ces données afin de les restituer de la manière la plus pratique possible.

Les bases de données relationnelles peuvent renvoyer des données sous la forme de rowsets.

Les curseurs (et les boucles qui les utilisent) sont conçus pour conserver un jeu de lignes stable afin de pouvoir effectuer certaines opérations sur chacune de ses lignes.

Par "choses", j'entends ici non pas de purs trucs de base de données, mais des choses réelles qui affectent le monde extérieur, les choses pour lesquelles la base de données est conçue, qu'il s'agisse d'afficher un tableau sur une page web, de générer un rapport financier ou d'envoyer un courriel.

Il n'est pas bon d'utiliser les curseurs pour des tâches purement liées aux bases de données (comme la transformation d'un rowset en un autre), mais il est parfaitement possible de les utiliser pour des choses comme celle que vous avez décrite.

Les méthodes basées sur les ensembles sont conçues pour fonctionner dans le cadre d'une seule transaction.

Si votre requête de base échoue pour une raison quelconque, votre base de données reviendra à l'état antérieur, mais vous ne pouvez pas "annuler" un courriel envoyé. Vous ne serez pas en mesure de garder la trace de vos messages en cas d'erreur.

2voto

gbn Points 197263

Il doit s'agir d'une opération ligne par ligne si vous avez besoin d'un e-mail par ligne. Il ne s'agit pas d'une action standard basée sur un ensemble.

Soit vous effectuez un WHILE en SQL, soit vous effectuez un "for each" dans un langage client.

Je n'enverrais pas d'emails à partir de triggers BTW : votre transaction est ouverte pendant que le trigger s'exécute.

1voto

Ce n'est pas la meilleure pratique mais si vous voulez éviter les boucles :

Vous pourriez créer une table "SendMails", avec un déclencheur sur Insert

Le sp_send_dbmail est appelé à l'intérieur du trigger.

alors vous le faites :

Truncate Table SendMails

insert into SendMails (From, To, Subject,text) Select field1,field2,field3,field4 from MyTable

1voto

Aaron Alton Points 9929

Configurer un abonnement piloté par les données dans SQL Server Reporting Services :-D

Pour moi, il s'agit d'une exigence de SSRS. TSQL n'est pas vraiment conçu pour la création de rapports en soi.

0voto

Chris Lively Points 59564

La meilleure façon d'y parvenir est de placer votre logique d'envoi d'e-mails dans une fonction définie par l'utilisateur.

Il vous suffit alors d'appeler SELECT MyEmailFunc(emailaddress) FROM MyTable

Il évite les boucles et vous pouvez même l'utiliser dans une déclaration de mise à jour pour montrer que le courriel a été envoyé. Par exemple :

UDPATE MyTable SET SENT = MyEmailFunc(emailaddress) WHERE sent = 0

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X