Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在DBMail-sqlserver的主体中添加变量_Sql Server_Tsql - Fatal编程技术网

Sql server 在DBMail-sqlserver的主体中添加变量

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

将my变量@dateDifference添加到正文消息时,正文在我的Outlook上显示为空白。但是,如果我删除该变量,消息将打印在电子邮件中

下面是我的代码:

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
    。(a
    VARCHAR
    +
    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
    。(a
    VARCHAR
    +
    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'