通过邮件发送带有SQL Server作业的查询结果

时间:2015-04-15 08:34:14

标签: sql sql-server email jobs

我正在尝试通过SQL Server作业发送一封包含查询结果的电子邮件。

查询工作正常,当我在@query sp_send_dbmail参数中传递TABLE时遇到问题

这是我的代码:

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 = 'foo@foooo.com', 
      @subject = 'Foooooooo',
      @query = @res,      
      @Attach_Query_result_as_file = 0

我收到了这个错误(用法语,但如果需要可以轻松翻译):

  

第0行:过程:sp_send_dbmail,消息206,级别16,状态2:Conflit   de types d'opérandes:table est incompatible avec nvarchar(max)

2 个答案:

答案 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',
      @query_result_separator=@Separateur,
      @recipients = 'foooo@foo.com', 
      @subject = @mailSubject,
      @query = @STMT,      
      @Attach_Query_result_as_file = 0

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

答案 1 :(得分:1)

根据sp_send_dbmail

的msdn文档

@query参数需要nvarchar(max)类型而不是Table。

替换

@query = @res 

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

编辑:

将此作为作业运行时,请确保SQL代理服务帐户使用的凭据具有足够的权限来执行此类查询。

出于测试目的,尝试执行另一次登录 execute as