it-swarm.com.de

Führen Sie die SQL-Anweisung aus und senden Sie das Ergebnis per E-Mail

Ich muss jeden Tag eine SQL-Anweisung ausführen und das Ergebnis per E-Mail an dba senden. Ich habe die Datenbank-E-Mail konfiguriert.

Unten ist Abfrage:

 SELECT
        account.accountID,
        account.name
    FROM
        account
        LEFT OUTER JOIN accountfeaturesetting afs 
            ON afs.accountid = account.accountid 
                and afs.featureid = 'Schedules' 
                and afs.settingid = 'EditReasons'
    WHERE
        ISNULL(afs.Value, '0') = '1'
        AND NOT EXISTS
 (SELECT 1 FROM program 
WHERE program.AccountID = account.AccountID
 AND program.Active = 1 AND 
(program.ScheduleEditReasonFlags <> 0 OR
 program.ScheduleEditReasonFields <> 0))
        AND account.IsMaster = 0

Dafür habe ich einen SQL-Job mit 2 Schritten erstellt:

  1. select-Anweisung ausführen
  2. ergebnis senden:

    Use MSDB
        EXEC msdb.dbo.sp_send_dbmail
            @profile_name = 'abc',
            @recipients = '[email protected]',
            @subject = 'queryresultset',
            @body='testmail',
            @query_attachment_filename='warning.csv'
    

Es wird ein Fehler ausgegeben und die Ergebnismenge wird nicht an die Abfrage angehängt.

Fehler: Parameter @attach_query_result_as_file kann nicht 1 (true) sein, wenn für Parameter @query kein Wert angegeben ist.
Eine Abfrage muss angegeben werden, um die Ergebnisse der Abfrage anzuhängen.
[SQLSTATE 42000] (Fehler 14625)

Bearbeiten:

Use MSDB
    EXEC msdb.dbo.sp_send_dbmail
        @profile_name = 'abc',
        @recipients = '[email protected]',
        @subject = 'queryresultset',
        @body='testmail',
        @query_attachment_filename='warning.csv'
    DECLARE @msg VARCHAR(250);
    declare @query varchar(2048);
    SELECT @msg = 'Please refer to the attached spread sheet for the report.';  

    set @query='
        SELECT
        account.accountID,
        account.name
    FROM
        account
        LEFT OUTER JOIN accountfeaturesetting afs 
            ON afs.accountid = account.accountid 
                and afs.featureid = 'Schedules' 
                and afs.settingid = 'EditReasons'
    WHERE
        ISNULL(afs.Value, '0') = '1'
        AND NOT EXISTS
 (SELECT 1 FROM program 
WHERE program.AccountID = account.AccountID
 AND program.Active = 1 AND 
(program.ScheduleEditReasonFlags <> 0 OR
 program.ScheduleEditReasonFields <> 0))
        AND account.IsMaster = 0
        go';
        exec (@query)

Bei der obigen Abfrage werden keine Zeitpläne und Werte für die Bearbeitungsbereiche verwendet. Ich erhalte immer noch einen Syntaxfehler, nachdem ich alle Variablen wie folgt deklariert habe:

declare @featureid varchar(100);
declare @settingid varchar(100);
declare @value varchar(100);
3
user120625

Ihr Code ist rückwärts. Sie senden die E-Mail und generieren dann die Abfrageergebnisse. Die gespeicherte Prozedur sp_send_dbmail führt die Abfrage für Sie aus und hängt die Ergebnisse entweder im Text der E-Mail oder als Anhang an.

Falls Sie sich nicht bewusst sind, bietet Microsoft auf seiner Website für SQL Server eine umfangreiche, umfassende und kostenlose Dokumentation an. Zum Beispiel ist sp_send_dbmail Ausführlich verfügbar unter: https://docs.Microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-send- dbmail-transact-sql

Der Parameter @query ist wie folgt dokumentiert:

[@ query =] 'query'
Ist eine auszuführende Abfrage. Die Ergebnisse der Abfrage können als Datei angehängt oder in den Text der E-Mail-Nachricht aufgenommen werden. Die Abfrage ist vom Typ nvarchar (max) und kann alle gültigen Transact-SQL-Anweisungen enthalten. Beachten Sie, dass die Abfrage in einer separaten Sitzung ausgeführt wird, sodass lokale Variablen im Skript, das sp_send_dbmail aufruft, für die Abfrage nicht verfügbar sind.

Sie haben auch mehrere Beispiele für den Aufruf von sp_send_dbmail, Einschließlich dieses hervorstechenden Punkts:

EXEC msdb.dbo.sp_send_dbmail  
    @profile_name = 'Adventure Works Administrator',  
    @recipients = '[email protected]',  
    @query = 'SELECT COUNT(*) FROM AdventureWorks2012.Production.WorkOrder  
                  WHERE DueDate > ''2004-04-30''  
                  AND  DATEDIFF(dd, ''2004-04-30'', DueDate) < 2' ,  
    @subject = 'Work Order Count',  
    @attach_query_result_as_file = 1 ;  

Sie müssen die Abfragedefinition also wie folgt an msdb.dbo.sp_send_dbmail Übergeben:

DECLARE @msg VARCHAR(250);
DECLARE @query varchar(2048);

SET @msg = 'Please refer to the attached spread sheet for the report.';  

SET @query='
    SELECT
        account.accountID,
        account.name
    FROM
        dbo.account
        LEFT OUTER JOIN dbo.accountfeaturesetting afs 
            ON afs.accountid = account.accountid 
                AND afs.featureid = ''Schedules'' 
                AND afs.settingid = ''EditReasons''
    WHERE
        ISNULL(afs.Value, ''0'') = ''1''
        AND NOT EXISTS 
            (
                SELECT 1 
                FROM dbo.program 
                WHERE program.AccountID = account.AccountID
                    AND program.Active = 1 
                    AND (
                        program.ScheduleEditReasonFlags <> 0 
                        OR program.ScheduleEditReasonFields <> 0
                        )
            )
        AND account.IsMaster = 0;';

EXEC msdb.dbo.sp_send_dbmail
    @profile_name = 'abc'
    , @recipients = '[email protected]'
    , @subject = 'queryresultset'
    , @body= @msg
    , @body_format = 'TEXT'
    , @query = @query
    , @execute_query_database = 'MyDB'  
    , @attach_query_result_as_file = 1
    , @query_attachment_filename='warning.csv'
    , @query_result_header = 1
    , @query_result_width = 80
    , @query_result_separator = ' '
    , @exclude_query_output = 0
    , @append_query_error = 1
    , @query_no_truncate = 0
    , @query_result_no_padding = 0;

Beachten Sie auch die zusätzlichen Parameter, die verschiedene Ausgabefaktoren steuern, z. B. wie die Abfrage formatiert wird usw.

Beachten Sie, dass ich im obigen Text @query Die einfachen Anführungszeichen "maskiert" habe, um zu verhindern, dass SQL Server sie als wörtliche Trennzeichen betrachtet. Grundsätzlich müssen alle einfachen Anführungszeichen im Parameter @query In zwei einfache Anführungszeichen umgewandelt werden. Erland Sommarskog hat ein exzellentes Stück über Dynamic SQL und verschachtelte Strings .

9
Max Vernon

Ich glaube, Sie sollten etwas Ähnliches tun:

DECLARE @sub VARCHAR(100);
DECLARE @qry VARCHAR(1000);
DECLARE @msg VARCHAR(250);
DECLARE @query NVARCHAR(1000);
DECLARE @query_attachment_filename NVARCHAR(520);
SELECT @sub = 'TEST XML ATTACHMENT';
SELECT @msg = 'Please refer to the attached spread sheet for the report.';
SELECT @query = 'SET NOCOUNT ON;
            Select top 10 * from master..sysobjects WITH(NOLOCK)';
SELECT @query_attachment_filename = 'test.csv';
EXEC msdb.dbo.sp_send_dbmail
     @profile_name = 'SQLMAIL',
     @recipients = '[email protected]',
     @copy_recipients = '[email protected]',
     @body = @msg,
     @subject = @sub,
     @query = @query,
     @query_attachment_filename = @query_attachment_filename,
     @attach_query_result_as_file = 1,
     @query_result_header = 1,
     @query_result_width = 256,
     @query_result_separator = '   ',
     @query_result_no_padding = 1;

ref: http://sqlworkday.blogspot.ru/2010/12/how-to-send-csv-or-xls-file-as.html

3
George K