通过邮件发送SQL Server中包含作业的查询结果
我正在尝试通过SQL Server作业发送一封包含查询结果的电子邮件 该查询工作正常,当我在sp_send_dbmail的@query参数中传递一个表时,我面临一个问题 这是我的密码:通过邮件发送SQL Server中包含作业的查询结果,sql,sql-server,email,jobs,Sql,Sql Server,Email,Jobs,我正在尝试通过SQL Server作业发送一封包含查询结果的电子邮件 该查询工作正常,当我在sp_send_dbmail的@query参数中传递一个表时,我面临一个问题 这是我的密码: DECLARE @res TABLE ( SiteCode [nvarchar](50), DateLastODV [datetime] ); INSERT INTO @res SELECT SiteCode ,MAX(DateODV) AS DateLastODV FR
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,Msg 206,级别16,状态2:Conflit
d'opérandes类型:表est不兼容avec nvarcharmax
根据的msdn文件 @查询参数需要nvarcharmax类型,而不是表 替换
@query = @res
与
编辑:
将此作为作业运行时,请确保SQL代理服务帐户使用的凭据具有执行此类查询的足够权限
出于测试目的,请尝试使用另一个登录名执行
根据 @查询参数需要nvarcharmax类型,而不是表 替换
@query = @res
与
编辑:
将此作为作业运行时,请确保SQL代理服务帐户使用的凭据具有执行此类查询的足够权限
出于测试目的,请尝试使用另一个登录名执行
我使用以下代码解决了问题:
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
我使用以下代码解决了我的问题:
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
是否将表变量作为@query的参数传递?根据MSDN,[@query=]'query'是要执行的查询。查询结果可以作为文件附加,也可以包含在电子邮件正文中。查询类型为nvarcharmax,可以包含任何有效的Transact-SQL语句。请注意,查询是在单独的会话中执行的,因此调用sp_send_dbmail的脚本中的本地变量对查询不可用。我想在参数'query'中设置查询结果,在本例中,我将变量'res'传递给'query',尝试类似的操作,@query='SELECT SiteCode,MAXDateODV AS DateLastODV FROM Configuration.ODVCompteur其中yearDateODV=2015 group by SiteCode order by DateLastODV desc'我已经尝试过这个方法,但得到了如下错误:错误格式化查询,可能是无效参数[SQLSTATE 42000]erreur 22050。您是否将表变量作为@query的参数传递?根据MSDN,[@query=]“query”是要执行的查询。查询结果可以作为文件附加,也可以包含在电子邮件正文中。查询类型为nvarcharmax,可以包含任何有效的Transact-SQL语句。请注意,查询是在单独的会话中执行的,因此调用sp_send_dbmail的脚本中的本地变量对t不可用查询。我想在参数'query'中设置查询结果,在本例中,我将变量'res'传递给'query'尝试类似的操作,@query='从Configuration.ODVCompteur中选择SiteCode,MAXDateODV作为DateLastODV,其中yearDateODV=2015按SiteCode分组按DateLastODV排序'I已经尝试过这个方法t遇到这样的错误:错误格式化查询,可能是无效参数[SQLSTATE 42000]erreur 22050。当然,我已经尝试过了,但遇到了这样的错误:错误格式化查询,可能是无效参数[SQLSTATE 42000]erreur 22050。在另一种情况下,查询工作正常。运行作业时,您应该检查提供了哪些凭据。您应该看看这个问题:当然,我已经尝试过这个问题,但出现了这样一个错误:错误格式化查询,可能是无效参数[SQLSTATE 42000]ERRREUR 22050。在另一种情况下,查询工作正常。运行作业时,您应该检查提供了哪些凭据。您应该查看以下问题: