Sql server 在DBMail-sqlserver的主体中添加变量
将my变量@dateDifference添加到正文消息时,正文在我的Outlook上显示为空白。但是,如果我删除该变量,消息将打印在电子邮件中 下面是我的代码:Sql server 在DBMail-sqlserver的主体中添加变量,sql-server,tsql,Sql Server,Tsql,将my变量@dateDifference添加到正文消息时,正文在我的Outlook上显示为空白。但是,如果我删除该变量,消息将打印在电子邮件中 下面是我的代码: DECLARE @sql NVARCHAR(255) DECLARE @dateDifference NVARCHAR(255) DECLARE @bodyMessage NVARCHAR(MAX) SET @sql = (SELECT backupFileDate
DECLARE @sql NVARCHAR(255)
DECLARE @dateDifference NVARCHAR(255)
DECLARE @bodyMessage NVARCHAR(MAX)
SET @sql = (SELECT backupFileDate
FROM #checkBackupTime
WHERE backupFileDate >= DATEADD(HH, -1, GETDATE()))
SET @dateDifference = (SELECT DATEDIFF(HOUR, @sql, CURRENT_TIMESTAMP))
SET @bodyMessage = 'The lastest backup file is ' + @dateDifference + ' hours old'
IF @sql IS NULL OR @sql = ''
BEGIN
EXEC msdb.dbo.sp_send_dbmail
@recipients = 'my@email.com',
@subject = N'mySubject',
@body = @bodyMessage;
END
有什么想法吗?这里使用的命名约定是。。。令人困惑尽管如此,您的查询仍存在一些问题:
backupFileName
,则以下代码将中断backupFileName
s(更多信息请参见#3)NULL
、0
或1
。它只能是这三个值的原因是,您将结果限制为前一个小时内的那些文件,然后询问它有多少个小时。它实际上只会是0
或NULL
(在过去一小时内没有备份的情况下)@dateDifference
转换为VARCHAR
:NULL
或0
,@bodyMessage
如果@dateDifference
为NULL
,则@bodyMessage
将最终为NULL
。(aVARCHAR
+NULL
=NULL
)@SQL为空或''
时,您才会发送电子邮件!你抱怨你的电子邮件是空白的,但只有在它是空白的情况下你才会发送它
提议的变更 删除时间限制并抓取
MAX(backupFileName)
:
对值使用COALESCE()
和CONVERT()
:
SET @bodyMessage = 'The lastest backup file is '
+ Coalesce(Convert(Varchar, @dateDifference), '')
+ ' hours old'
并更改电子邮件条件以检查自上次备份以来的时间:
If @DateDifference > 1
Begin
Exec msdb.dbo.sp_send_dbmail
...
这里使用的命名约定是。。。令人困惑尽管如此,您的查询仍存在一些问题:
backupFileName
,则以下代码将中断backupFileName
s(更多信息请参见#3)NULL
、0
或1
。它只能是这三个值的原因是,您将结果限制为前一个小时内的那些文件,然后询问它有多少个小时。它实际上只会是0
或NULL
(在过去一小时内没有备份的情况下)@dateDifference
转换为VARCHAR
:NULL
或0
,@bodyMessage
如果@dateDifference
为NULL
,则@bodyMessage
将最终为NULL
。(aVARCHAR
+NULL
=NULL
)@SQL为空或''
时,您才会发送电子邮件!你抱怨你的电子邮件是空白的,但只有在它是空白的情况下你才会发送它
提议的变更 删除时间限制并抓取
MAX(backupFileName)
:
对值使用COALESCE()
和CONVERT()
:
SET @bodyMessage = 'The lastest backup file is '
+ Coalesce(Convert(Varchar, @dateDifference), '')
+ ' hours old'
并更改电子邮件条件以检查自上次备份以来的时间:
If @DateDifference > 1
Begin
Exec msdb.dbo.sp_send_dbmail
...
如果
@datedifference
为NULL
则整个表达式为NULL
。尝试:
SET @bodyMessage = 'The lastest backup file is ' + ISNULL(@dateDifference, '') + ' hours old'
如果
@datedifference
为NULL
则整个表达式为NULL
。尝试:
SET @bodyMessage = 'The lastest backup file is ' + ISNULL(@dateDifference, '') + ' hours old'
你选择的列名让我很困惑。。。为什么备份文件名是日期时间?为什么将
备份文件名设置为名为@sql
的变量?这里使用的命名法令人困惑…如果它真的困扰你-我会改变它你对列名的选择让我困惑。。。为什么备份文件名是日期时间?为什么将备份文件名设置为名为@sql
的变量?这里使用的命名法令人困惑…如果真的让你困扰的话-我会改变它谢谢,做了建议的改变,一切似乎都正常。谢谢,做了建议的改变,一切似乎都正常。
If @DateDifference > 1
Begin
Exec msdb.dbo.sp_send_dbmail
...
SET @bodyMessage = 'The lastest backup file is ' + ISNULL(@dateDifference, '') + ' hours old'