Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Procédure stockée avec envoi d'une table par mail


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Procédure stockée avec envoi d'une table par mail
    Bonjour,
    voici une procédure stockée qui s’exécute sans problème. Elle récupère les données d'une table GCBILAN_IGP qui contient 8 lignes
    et les envois par mail sous la forme d'une table qui contient bien les 8 lignes de la table SQL.
    Mon seul soucis est que cette procédure envoi 8 fois le mail ! Peut-être un soucis avec le CURSOR ?

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    ALTER PROCEDURE [dbo].[BILAN_IGP_SEND_MAIL] 
    	-- Add the parameters for the stored procedure here
    @mail varchar(250)
    AS
    BEGIN
    -- Insert statements for procedure here
    DECLARE @MAIL_BODY NVARCHAR(max),
    @BI_COD_ART nvarchar(25),
    @BI_ART_LIB nvarchar(255),
    @BI_LOT int,
    @BI_PDS_ARR float,
    @BI_NBU_ARR int,
    @BI_PDS_DEM float,
    @BI_NBU_DEM int,
    @BI_ECART_PDS float,
    @BI_ECART_NBU int
    DECLARE c1 CURSOR FOR
    select BI_COD_ART,BI_ART_LIB,BI_LOT,BI_PDS_ARR,BI_NBU_ARR,BI_PDS_DEM,BI_NBU_DEM,
    BI_ECART_PDS,BI_ECART_NBU
     from GCBILAN_IGP;
     
    OPEN c1
     
    FETCH NEXT FROM c1
    INTO @BI_COD_ART,@BI_ART_LIB,@BI_LOT,@BI_PDS_ARR,@BI_NBU_ARR,@BI_PDS_DEM,@BI_NBU_DEM,@BI_ECART_PDS,@BI_ECART_NBU
     
    WHILE @@FETCH_STATUS = 0  
    BEGIN
     
    /* HEADER */
    --SET @MAIL_BODY = 'sfqfff';
    SET @MAIL_BODY = '<table border="1" align="center" cellpadding="2" cellspacing="0" style="color:black;font-family:consolas;text-align:center;">' +
        '<tr>
        <th>CODE ARTICLE</th>
        <th>LIBELLE</th>
    	<th>LOT</th>
    	<th>POIDS ARRIVAGES</th>
    	<th>UNITES ARRIVAGES</th>
    	<th>POIDS DEMOULE</th>
    	<th>UNITES DEMOULE</th>
    	<th>ECART POIDS</th>
    	<th>ECART UNITES</th>
        </tr>'
     
    		/* ROWS */
    SELECT
        @MAIL_BODY = @MAIL_BODY +
            '<tr>' +
            '<td>&nbsp;' + BI_COD_ART + '&nbsp;</td>' + 
            '<td>&nbsp;' + BI_ART_LIB  + '&nbsp;</td>' + 
    		'<td>&nbsp;' + CONVERT(varchar,BI_LOT)  + '&nbsp;</td>' +
    	    '<td>&nbsp;' + CONVERT(varchar,BI_PDS_ARR)  + '&nbsp;</td>' + 
    		'<td>&nbsp;' + CONVERT(varchar,BI_NBU_ARR)  + '&nbsp;</td>' +
    		'<td>&nbsp;' + CONVERT(varchar,BI_PDS_DEM)  + '&nbsp;</td>' + 
    		'<td>&nbsp;' + CONVERT(varchar,BI_NBU_DEM)  + '&nbsp;</td>' +
    		'<td>&nbsp;' + CONVERT(varchar,BI_ECART_PDS)  + '&nbsp;</td>' + 
    		'<td>&nbsp;' + CONVERT(varchar,BI_ECART_NBU)  + '&nbsp;</td>' +
            '</tr>'
    FROM GCBILAN_IGP
    order by BI_ART_LIB;
     
    SELECT @MAIL_BODY = @MAIL_BODY + '</table>'
     
    EXEC msdb.dbo.sp_send_dbmail
    @profile_name = 'Notifications',
    @recipients=@mail,
        @subject = '[BILAN IGP] Démoulage IGP',
        @body = @MAIL_BODY,
        @body_format='HTML';
     
    FETCH NEXT FROM c1
    INTO @BI_COD_ART,@BI_ART_LIB,@BI_LOT,@BI_PDS_ARR,@BI_NBU_ARR,@BI_PDS_DEM,@BI_NBU_DEM,@BI_ECART_PDS,@BI_ECART_NBU
     
    END
     
    CLOSE c1
    DEALLOCATE c1
    END


    Merci de votre aide.

  2. #2
    Modérateur

    Bonjour,

    C'est normal, l'appel de la procédure d'envoi du mail est dans la boucle.

    A priori, seul le SELECT devrait être dans la boucle...

  3. #3
    Rédacteur

    De plus la procédure msdb.dbo.sp_send_dbmail permet d'envoyer le contenu du résultat d'une requête directement sans être obligé de faire tout ce bordel....

    A lire :
    https://docs.microsoft.com/fr-fr/sql...l-server-ver15
    Paramètre @query

    Et pour apprendre à travailler avec SQL Server, rien ne vaut la lecture de mon livre :



    A +
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  4. #4
    Expert éminent
    Citation Envoyé par SQLpro Voir le message
    De plus la procédure msdb.dbo.sp_send_dbmail permet d'envoyer le contenu du résultat d'une requête directement sans être obligé de faire tout ce bordel....
    Je suis d'accord, elle sait faire ça, mais si tu veux un peu de présentation et quelque chose d'un peu plus souple et pratique que les options de sp_send_dbmail, ça passe par une couche de html.
    les règles du forum - mode d'emploi du forum
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    JE NE RÉPONDS PAS aux questions techniques par message privé.

  5. #5
    Rédacteur

    tu la sort en XML avec l'option FOR XML AUTO t tu applique une feuille de style pour la rendre cosmétiquement belle APRES avoir extrait les données. Un SGBDR n'est pas du tout fait pour faire de la peinture !

    A +
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  6. #6
    Expert éminent
    Citation Envoyé par SQLpro Voir le message
    Un SGBDR n'est pas du tout fait pour faire de la peinture !
    Bien d'accord, mais ça va parfois bien plus vite de faire ça dégueulassement niveau bd que d'avoir à faire avec certains devs et architectes
    les règles du forum - mode d'emploi du forum
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    JE NE RÉPONDS PAS aux questions techniques par message privé.

###raw>template_hook.ano_emploi###