Результат запроса в xlsx и отправка почты в SQL Server - PullRequest
0 голосов
/ 18 февраля 2019

Существует процедура, в которой создается файл Excel, в нем сохраняется результат выбора.Этот файл прикреплен к письму и отправлен по почте.Но проблема в том, что файл создан и отправлен пустым.Вручную все работает, но не вместе.

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[sp_sendMail]
    @SID INT,
    @EMAIL VARCHAR(512),
    @CUR INT
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE 
        @MAILID INT,
        @TABLEHTML VARCHAR(MAX),
        @CMD SYSNAME,
        @FILENAME NVARCHAR(MAX),
        @SQL NVARCHAR(MAX),
        @PID INT,
        @DATE_START DATE,
        @DATE_END DATE

    SELECT
        @PID = PATIENTS_ID,
        @DATE_START = DATE_START,
        @DATE_END = DATE_END
    FROM 
        TABLE 
    WHERE 
        ID = @SID

    EXEC SP_EXECUTESQL N'sp_configure ''show advanced options'', 1; reconfigure; '
    EXEC ('RECONFIGURE')
    EXEC SP_EXECUTESQL N'sp_configure ''xp_cmdshell'', 1; reconfigure;'
    EXEC ('RECONFIGURE')

    SET @FILENAME =  'D:\' + CAST(@SID AS VARCHAR) + '_' + REPLACE(CONVERT(VARCHAR, GETDATE(), 104), '.', '') + '_' + CAST(@CUR AS VARCHAR) + '.xlsx'
    SET @CMD = 'copy D:\Example.xlsx ' + @FILENAME  

    EXEC MASTER..XP_CMDSHELL @CMD;

    SET @SQL = 'INSERT INTO OPENROWSET(''Microsoft.ACE.OLEDB.12.0'', 
  ''Excel 12.0;Database=' + @FILENAME + ';HDR=YES'',
  ''SELECT DATE, CODE, LABEL, CNT, CU, SCO, DISCOUNT FROM [Sheet1$]'')
    SELECT 
        CONVERT(VARCHAR, ORDER.DATE, 104) DATE,
        EMPLOYEE.CODE CODE,
        EMPLOYEE.LABEL LABEL,
        CAST(ORDER.CNT AS INT) CNT,
        CAST(ORDER.PRICE AS MONEY) CU,
        CAST(ORDER.PRICE_TO_PAY AS MONEY) SCO,
        CAST(ORDER.DISCOUNT AS INT) DISCOUNT
    FROM 
        ORDER
    JOIN 
        EMPLOYEE ON EMPLOYEE._ID = ORDER._ID 
    WHERE
        (CONVERT(DATE, ORDER.DATE) >= CONVERT(DATE, @DATE_START) 
        AND CONVERT(DATE, ORDER.DATE) <= CONVERT(DATE, @DATE_END))
        AND (ORDER.ID in (@PID))
    ORDER BY ORDER.DATE'

    EXEC SP_EXECUTESQL
         @SQL,
         N'@DATE_START DATE, @DATE_END DATE, @PATID INT',
         @DATE_START = @DATE_START,
         @DATE_END = @DATE_END,
         @PID = @PID

    SET @TABLEHTML =
    N'<H1>Hello!</H1>' +
    N'<span>num: </span>' + CAST(@SID AS VARCHAR(MAX)) +
    N'<span>, email: </span>' + CAST(@EMAIL AS VARCHAR(MAX)) +
    N'<span> sent! </span>'

EXEC msdb.dbo.sp_send_dbmail
  @profile_name = 'site.com',
  @recipients = 'admin@site.com',
  @subject = 'subj',
  @body = @tableHTML,
  @body_format = 'HTML',
  @file_attachments = @FILENAME,
  @mailitem_id = @mailid output 


IF (@MAILID > 0 AND @@ERROR = 0)
  UPDATE TABLE SET [SIGN] = 1, [SENT] = GETDATE(), SENDER = @CUR WHERE ID = @SID


EXEC SP_EXECUTESQL N'sp_configure ''show advanced options'', 1; reconfigure; '
EXEC ('RECONFIGURE')
EXEC SP_EXECUTESQL N'sp_configure ''xp_cmdshell'', 0; reconfigure;'
EXEC ('RECONFIGURE')

END

1 Ответ

0 голосов
/ 19 февраля 2019

Да, JGFMK был прав!Если выполнить этот код, то будет открыт openrowset:

if( 1 = 0)
begin
INSERT INTO OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
  'Excel 12.0;Database=D:\file;HDR=YES',
  'SELECT DATE, CODE, LABEL, CNT, CU, SCO, DISCOUNT FROM [Sheet1$]')
    SELECT..
end

Как заставить его работать по условию?

...