在SSMS中为通过电子邮件发送的报告安排SQL查询
我尝试了这种特殊的查询格式来执行使用SSMS通过电子邮件发送的报告,但似乎效果不太好。 有专家能帮我吗 下面给出了代码在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 @
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
在@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)