通过邮件发送包含 SQL 服务器中的作业的查询结果
Send by mail a query result with a job in SQL Server
我正在尝试通过 SQL 服务器作业发送包含查询结果的电子邮件。
查询运行完美,当我在 sp_send_dbmail
的 @query
参数中传递 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
我收到此错误(法语,但如果需要可以轻松翻译):
Line 0: Procedure: sp_send_dbmail, Msg 206, Level 16, State 2: Conflit
de types d'opérandes : table est incompatible avec nvarchar(max)
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
我使用这段代码解决了我的问题:
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
我正在尝试通过 SQL 服务器作业发送包含查询结果的电子邮件。
查询运行完美,当我在 sp_send_dbmail
@query
参数中传递 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
我收到此错误(法语,但如果需要可以轻松翻译):
Line 0: Procedure: sp_send_dbmail, Msg 206, Level 16, State 2: Conflit de types d'opérandes : table est incompatible avec nvarchar(max)
@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
我使用这段代码解决了我的问题:
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