在SSMS中为通过电子邮件发送的报告安排SQL查询

在SSMS中为通过电子邮件发送的报告安排SQL查询,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我尝试了这种特殊的查询格式来执行使用SSMS通过电子邮件发送的报告,但似乎效果不太好。 有专家能帮我吗 下面给出了代码 declare @body1 varchar(4000) declare @query varchar(2048) set @body1 = 'Sample Email from SQL server ' + CONVERT( VARCHAR( 20 ), GETDATE(), 113 ) + ' ' EXEC msdb.dbo.sp_send_dbmail @

我尝试了这种特殊的查询格式来执行使用SSMS通过电子邮件发送的报告,但似乎效果不太好。 有专家能帮我吗

下面给出了代码

declare @body1 varchar(4000)
declare @query varchar(2048)

set @body1 = 'Sample Email from SQL server ' + CONVERT( VARCHAR( 20 ), GETDATE(), 113 ) + 
' '

EXEC msdb.dbo.sp_send_dbmail 
    @profile_name='Reporting',
    @recipients='ket@gmail.com',
    @subject = 'Test',
    @body = @body1,
    @body_format = 'HTML',
    @query_result_header = 1,
    @query = ''Declare @Top  int = null       --<<  Sets top of Hier Try 12
Declare @Nest varchar(25) =''  --<<  Optional: Added for readability

;with cteHB (Seq,Path,PROBLEM_TYPE_ID,PARENT_ID,Lvl,PROBLEM_TYPE_NAME) as (
    Select  Seq  = cast(1000+Row_Number() over (Order by PROBLEM_TYPE_NAME) as varchar(500))
           ,Path = cast(PROBLEM_TYPE_ID as varchar(500))
           ,PROBLEM_TYPE_ID
           ,PARENT_ID
           ,Lvl=14
           ,PROBLEM_TYPE_NAME 
     From   problem_type 
     Where  IsNull(@Top,-1) = case when @Top is null then isnull(PARENT_ID,-1) else PROBLEM_TYPE_ID end
     Union  All
     Select Seq  = cast(concat(cteHB.Seq,'.',1000+Row_Number() over (Order by cteCD.PROBLEM_TYPE_NAME)) as varchar(500))
           ,Path = cast(concat(cteHB.Path,'.',cteCD.PROBLEM_TYPE_ID) as varchar(500))
           ,cteCD.PROBLEM_TYPE_ID
           ,cteCD.PARENT_ID,cteHB.Lvl+1
           ,cteCD.PROBLEM_TYPE_NAME  
     From   problem_type cteCD 
     Join   cteHB on cteCD.PARENT_ID = cteHB.PROBLEM_TYPE_ID)
    ,cteR1 as (Select Seq,PROBLEM_TYPE_ID,R1=Row_Number() over (Order By Seq) From cteHB)
    ,cteR2 as (Select A.Seq,A.PROBLEM_TYPE_ID,R2=Max(B.R1) From cteR1 A Join cteR1 B on (B.Seq like A.Seq+'%') Group By A.Seq,A.PROBLEM_TYPE_ID )
    ,cteFinalHier as (
        Select B.R1  
              ,C.R2
              ,A.PROBLEM_TYPE_ID
              ,A.PARENT_ID
              ,A.Lvl
              ,PROBLEM_TYPE_NAME = Replicate(@Nest,A.Lvl-1) + A.PROBLEM_TYPE_NAME
              ,A.Seq                                      -- < Included for Illustration
              ,A.Path                                     -- < Included for Illustration
         From cteHB A
         Join cteR1 B on A.PROBLEM_TYPE_ID=B.PROBLEM_TYPE_ID
         Join cteR2 C on A.PROBLEM_TYPE_ID=C.PROBLEM_TYPE_ID
    )
Select A.Job_ticket_id as 'No.'
,A.Report_Date as 'Open Date'
      --,[Problem_Type_Name(Parent)]=C.PROBLEM_TYPE_NAME
      --,[Problem_Type_Name(Child)] =B.PROBLEM_TYPE_NAME
      ,concat (C.PROBLEM_TYPE_NAME,'-',B.PROBLEM_TYPE_NAME) as 'Request Type'

      ,DATEDIFF(DAY,a.LAST_UPDATED,getdate()) as 'Days since Update'

      --,a.STATUS_TYPE_ID AS 'Status ID'

      ,STATUS_TYPE.STATUS_TYPE_NAME as 'Ticket Status'

      ,PRIORITY_TYPE_NAME as'Priority'

      --,A.ASSIGNED_TECH_ID
     ,isnull(t.lAST_NAME,'') + ' ' +isnull(T.FIRST_NAME,'') [Assigned Tech]
      ,TECH_GROUP.NAME as 'Tech Group'

  ------------------------------JOINS--------------------------------------------------                                                                                 
 From  JOB_TICKET A
 Join  cteFinalHier B on A.PROBLEM_TYPE_ID=B.PROBLEM_TYPE_ID

 INNER JOIN [SWHD01].[dbo].[PRIORITY_TYPE] ON A.[PRIORITY_TYPE_ID] = [PRIORITY_TYPE].[PRIORITY_TYPE_ID]

 INNER JOIN [SWHD01].[dbo].[STATUS_TYPE] ON A.[STATUS_TYPE_ID] = [STATUS_TYPE].[STATUS_TYPE_ID]

  inner join [SWHD01].[dbo].TECH_GROUP_LEVEL on A.TECH_GROUP_LEVEL_ID=TECH_GROUP_LEVEL.ID

 join TECH_GROUP on TECH_GROUP.ID= TECH_GROUP_LEVEL.tech_group_id

 LEFT JOIN TECH T on T.CLIENT_ID = A.ASSIGNED_TECH_ID

 Cross Apply (Select Top 1 * from cteFinalHier Where B.R1 between R1 and R2 and Lvl=1) C

 -------------Tickets for the Last 6 months---------------------------------------------------

 where datediff(month, A.REPORT_DATE, getdate()) <= 6


and a.STATUS_TYPE_ID <> 3
and NAME like '%NOC%'
and LEVEL_NUMBER ='2'
and DATEDIFF(DAY,a.LAST_UPDATED,getdate()) <> 0
and C.PROBLEM_TYPE_NAME not like 'Problem Management'
------------------------------------------------------------------------
 Group By C.PROBLEM_TYPE_NAME,a.JOB_TICKET_ID,B.PROBLEM_TYPE_NAME,B.PROBLEM_TYPE_ID, a.REPORT_DATE,a.CLOSE_DATE,SWHD01.dbo.PRIORITY_TYPE.PRIORITY_TYPE_NAME,a.FIRST_RESPONSE_DATE,B.R1,a.LAST_UPDATED,a.STATUS_TYPE_ID,TECH_GROUP_LEVEL.LEVEL_NUMBER,TECH_GROUP.NAME,STATUS_TYPE.STATUS_TYPE_NAME,A.ASSIGNED_TECH_ID,LAST_NAME,FIRST_NAME
 Order By 'Days since Update' desc;

 exec (@query);

    @exclude_query_output = 1,
    @append_query_error = 1,
    @attach_query_result_as_file = 1,
    @query_attachment_filename = 'qry.csv',
    @query_result_no_padding = 1

当我们声明varchar类型数据类型时,我们必须首先为它们分配空值,这样分配就不会失败。 您需要查看代码的内容很少

  • 参数@query的值为空,所以需要从exec(@query)语句执行什么
  • 在exec(@query)之后放入;这将终止此语句,因此您要对以下变量执行什么操作

    @排除查询输出=1, @追加查询错误=1, @将查询结果附加为文件=1, @查询\附件\文件名='qry.csv', @查询\u结果\u否\u填充=1


  • 看起来
    @query
    @query=''
    之后从未重新定义过。好的。我可以做些什么样的改变以使其顺利运行@罗格斯先生,这真是一个疑问。您是否考虑过/是否能够使用SSR?除了能够为您的输出创建一个有吸引力的格式外,您还能够以多种方式安排结果的电子邮件发送,包括基于查询的邮件列表。但要回答您的问题,您的问题似乎是,您的庞大查询实际上不是一个字符串。以“”开头,然后结束。您需要用单引号将其括起来,并确保其中的任何单引号都是双引号。
    Msg 14625, Level 16, State 1, Procedure sp_send_dbmail, Line 280 [Batch Start Line 0]
    Parameter @attach_query_result_as_file cannot be 1 (true) when no value is specified for parameter @query. A query must be specified to attach the results of the query.
    
    (0 row(s) affected)