【问题标题】:SQL - how to check table for new data?SQL - 如何检查表中的新数据?
【发布时间】:2009-02-06 10:49:47
【问题描述】:

我需要创建一个存储过程,在执行时检查过去 12 小时内是否有任何新行添加到表中。如果不是,则必须向收件人发送一封警告电子邮件。

我有发送电子邮件的程序,但问题是查询本身。我想我必须制作一个使用当前日期并将其与行中的日期进行比较的 sql 命令。但是我是一个完整的 SQL 初学者,所以我什至无法使用正确的词在 google 上找到任何东西。

短版:

使用 MS SQL Server 2005,我如何检查日期,然后根据过去 12 小时内是否创建新行返回结果,并使用该结果来决定是否发送电子邮件?

【问题讨论】:

    标签: sql sql-server-2005 stored-procedures


    【解决方案1】:

    这样的事情应该会如你所愿。

    Select ID
    from TableName
    where CreatedDate >= dateadd(hour,-12,getDate())
    

    希望这很清楚,但请随时提出更多问题。

    干杯,约翰

    【讨论】:

      【解决方案2】:

      假设您在表格中的日期字段是“CreateDate”,它的类型是 DateTime。 您要比较的时间是:GETDATE() (返回日期+时间) 要获得 12 小时之前的日期时间值,使用 DATEADD 完成: DATEADD(小时, -12, GETDATE())

      所以如果我们想要在过去 12 小时内添加的行数,我们会这样做:

      SELECT COUNT(*)
      FROM Table
      WHERE CreateDate >= DATEADD(hour, -12, GETDATE())
      

      在您的过程中,您必须将此查询的结果存储到一个变量中并检查它是否 > 0,所以:

      DECLARE @amount int
      SELECT @amount=COUNT(*)
      FROM Table
      WHERE CreateDate >= DATEADD(hour, -12, GETDATE())
      

      然后您将检查 @amount 变量是否 > 0。

      【讨论】:

        【解决方案3】:

        您可以使用触发器,此链接有几个示例:http://msdn.microsoft.com/en-us/library/aa258254(SQL.80).aspx

        USE pubs
        IF EXISTS (SELECT name FROM sysobjects
              WHERE name = 'reminder' AND type = 'TR')
           DROP TRIGGER reminder
        GO
        
        CREATE TRIGGER reminder
        ON titles
        FOR INSERT, UPDATE, DELETE 
        AS
           EXEC master..xp_sendmail 'MaryM', 
              'Don''t forget to print a report for the distributors.'
        GO
        

        如果您不希望每次插入/更新都有某些内容,则可以将数据复制到另一个表,然后每 12 小时检查一次该表,报告其中的行,然后删除它们...

        【讨论】:

          【解决方案4】:

          假设您在这张桌子上有: - 一个唯一的 id 自动递增 - 包含行创建时间戳的 created_timestamp 字段

          -> 有一个新表

          reported_rows
            - report_timestamp
            - last_id_seen
           (OR)
            - last_timestamp_seen
          

          在您每次发送电子邮件时使用实际值填写报告行 并且在发送电子邮件之前,检查之前的值,这样您就知道添加了哪些行

          【讨论】:

            【解决方案5】:

            如果表格有标识字段,您还可以保存最大值(作为书签),下次检查是否有任何行的 ID 大于您保存的书签。如果键是集群键,可能会更快。

            【讨论】:

              猜你喜欢
              • 2016-09-15
              • 1970-01-01
              • 2021-07-22
              • 2017-11-23
              • 1970-01-01
              • 2012-09-26
              • 2023-01-17
              • 2014-05-21
              • 2021-01-07
              相关资源
              最近更新 更多