עיצוב אימיילים ב-SQL Server בעזרת Python

13/08/2017

אין תגובות

אצלנו מקובל לשלוח דוחות באימייל לרשימות תפוצה שונות: במקרה הטוב, כשיש תקלה, הנמענים מקבלים התרעה; ובמקרה הפחות טוב – הם מקבלים אימיילים גם כשהכל בסדר.. משל למה הדבר דומה? באמצע תוכנית טלוויזיה יש פתאום מבזק: מה קרה? פיגוע? לא: בסך הכל רוצים להודיע שלא קרה כלום ושאשר להירגע ולהמשיך לצפות בתוכנית..
בכל מקרה: משלוח האימייל מתבצע בעזרת הפרוצדורה sp_send_dbmail, ויש שם שלל אפשרויות איך, מה, ולמי לשלוח. מקובל לשלוח אימיילים בעיצוב html שמאפשר להדגיש, לעמד, ולשלוח הודעה מעוצבת לתפארת. לשם כך יש לחזור למקורות ולהיזכר כיצד משתמשים בכל התגיות, יכולת בהחלט ראויה להערכה כשמדובר בילד ביסודי, אך לא כשמדובר ב-DBA.. מישהו מכם, ידיד ה-DBA-ים היה מציין ב-CV שלו שהוא יודע html? זה בבחינת כל המוסיף גורע..
לענייננו: לשלוח פלט מעוצב של שאילתה בתוך אימייל זו עבודת נמלים וטרדה לא קטנה. לא משהו ש-DBA לא יכול לו, אבל בזבוז זמן לחינם. כאן מגיע הפייתון הבלתי נלאה לעזרתנו: בעזרת פרוצדורת המערכת sp_execute_external_script נעביר לפייתון פלט של שאילתה, ונקבל בחזרה מחרוזת html המציגה אותו (את הפלט) כטבלה:

Declare    @Result Varchar(Max);

Exec    sp_execute_external_script

        @language=N'Python',

        @script =N'

import pandas as pd

T=InputDataSet

MyHtml=T.head(1000).to_html()

Result=MyHtml

',

       @input_data_1=N'Select ID,Format(GetDate,''yyyy-MM-dd hh:mm:ss:fff'') GetDate,Format(GetUTCDate,''yyyy-MM-dd hh:mm:ss:fff'') GetUTCDate,HostName,SUserName,UserName,AppName,Txt,ObjectName From MyLinkedServer.GeriReshefDB.dbo.T_Log;',

       @params=N'@Result Varchar(Max) Output',

       @Result=@Result Output;

 

Exec    msdb.dbo.sp_send_dbmail

        @recipients='GeriReshef@GMail.com',  

        @subject='My report: SQL Server & Python',  

        @body=@Result,  

        @body_format='HTML';

יש מספר מגבלות שוליות על הנתונים המועברים, למשל- לא ניתן להעביר לפייתון פלט הכולל תאריכים, ולכן יש להשתמש ב-Format כדי להפוך אותם למחרוזות.
את השאילתה “שלי” יש להמיר בשאילתה שלכם.
אינני דן כאן בקינפוג אופציית האימיילים ב-SQL Server, וזה מצדיק פוסט נפרד.
מה שלא יהיה- הפלט יראה בערך כך:

image

הוסף תגובה
facebook linkedin twitter email

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *