2015-04-15 1 views
1

Я пытаюсь отправить электронное письмо по заданию SQL Server с результатом запроса.Отправить по почте результат запроса с заданием в SQL Server

Запрос работает отлично, и я сталкиваюсь проблема, когда я прохожу таблицу в параметре sp_send_dbmail

Здесь @query мой код:

DECLARE @res TABLE 
(
    SiteCode [nvarchar](50), 
    DateLastODV [datetime] 
); 

INSERT INTO @res 
SELECT 
     SiteCode 
     ,MAX(DateODV) AS DateLastODV 
    FROM Configuration.ODVCompteur 
    where year(DateODV) = 2015 
    group by SiteCode 
    order by DateLastODV desc 

EXEC msdb.dbo.sp_send_dbmail 
     @profile_name = 'Foo', 
     @recipients = '[email protected]', 
     @subject = 'Foooooooo', 
     @query = @res,  
     @Attach_Query_result_as_file = 0 

Я получил эту ошибку (на французском языке, но может легко будет переводить при необходимости):

линия 0: Процедура: sp_send_dbmail, Msg 206, уровень 16, состояние 2: Conflit де типы d'opérandes: стол Текущая несовместимыми ауес NVARCHAR (макс)

+0

Вы проходящее 'таблицы Variable' в качестве параметра для' @ query'? –

+1

Согласно MSDN, '[@ query =] 'query' Выполняется запрос. Результаты запроса могут быть прикреплены в виде файла или включены в тело сообщения электронной почты. Запрос имеет тип nvarchar (max) и может содержать любые допустимые операторы Transact-SQL. Обратите внимание, что запрос выполняется в отдельном сеансе, поэтому локальные переменные в скрипте, вызывающем sp_send_dbmail, недоступны запросу. –

+0

Я хочу установить результат запроса в параметре «запрос», и в этом примере я передаю запрос переменная 'Рез' на 'запрос' –

ответ

3

Я решить мою проблему, используя этот код:

DECLARE @count TABLE(SiteCode [nvarchar](50), DateLastODV [datetime]) 

DECLARE @Separateur varchar(1) 
DECLARE @bodyHtml NVARCHAR(MAX) 
DECLARE @mailSubject NVARCHAR(MAX) 
DECLARE @STMT VARCHAR(100) 
DECLARE @RtnCode INT 

SET @Separateur=';' 

INSERT INTO @count 
SELECT 
     SiteCode 
     ,MAX(DateODV) AS DateLastODV 
    FROM Configuration.ODVCompteur 
    where year(DateODV) = 2015 
    group by SiteCode 
    order by DateLastODV DESC 

BEGIN 
    IF OBJECT_ID('tempdb..##TEMPTABLE') IS NOT NULL 
    drop table ##TEMPTABLE 

    select * into ##TEMPTABLE FROM @count 

    SET @STMT = 'SELECT * FROM ##TEMPTABLE' 
    SET @bodyHTML ='Test ODV' 
    SET @mailSubject ='Supervision ODV' 

    USE msdb 

    EXEC @RtnCode = sp_send_dbmail 
     @profile_name = 'Fooo', 
     @[email protected], 
     @recipients = '[email protected]', 
     @subject = @mailSubject, 
     @query = @STMT,  
     @Attach_Query_result_as_file = 0 

    IF @RtnCode <> 0 
     RAISERROR('Error.', 16, 1) 
END 
0

В соответствии с документацией на MSDN из sp_send_dbmail

параметра @query ожидает NVARCHAR (макс) типа не таблицы.

заменить

@query = @res 

с

@query = 'SELECT 
     SiteCode 
     ,MAX(DateODV) AS DateLastODV 
    FROM Configuration.ODVCompteur 
    where year(DateODV) = 2015 
    group by SiteCode 
    order by DateLastODV desc' 

EDIT:

Во время работы в этом качестве задания убедитесь, что учетные данные используются для учетной записи службы агента SQL имеет достаточно привилегий для выполнения таких запрос.

Для целей тестирования Попробуйте выполнить в качестве другого входа в системе с execute as

+0

Конечно, я уже пробовал это, но получил такую ​​ошибку:' Ошибка запрос форматирования, возможно, я nvalid parameters [SQLSTATE 42000] (erreur 22050). Запрос отлично работает в другом случае –

+1

, вы должны проверить, какие учетные данные предоставляются при запуске задания. Вы должны посмотреть на этот вопрос: http://stackoverflow.com/questions/15112849/sp-send-dbmail-executed-from-job-fails-with-query-result-attached-as-file – mxix