【问题标题】:SELECT 1 FROM [SystemEventLog]从 [系统事件日志] 中选择 1
【发布时间】:2014-03-10 09:49:59
【问题描述】:

我正在使用SQL Server 2008 R2

我确实有一个每天执行存储过程的 SQL 作业8:00 AM

在stored里面有一条语句:

    DECLARE @midnight datetime,
    @startTime datetime = GETUTCDATE();

    -- Has this stored procedure already run for today?
    IF EXISTS (SELECT 1 FROM [SystemEventLog] WHERE [CreatedDateTime_UTC] >= CAST(@midnight AS DATE) AND [CreatedDateTime_UTC] < DATEADD(DD, 1, CAST(@midnight AS DATE)))
    BEGIN
         RETURN
    END


-- log that this storedproc ran
DECLARE @SystemEventLogId int 
INSERT INTO [dbo].[SystemEventLog] ( [EventType_Id], [StoredProcName], [Details] )
VALUES( 1, 'StoredProcedureOne', null )

根据评论,这个块正在检查这个存储过程今天是否已经运行,如果是则返回。

但我不知道它如何检查这个程序今天是否已经运行?

谁能解释一下?

谢谢。

【问题讨论】:

  • 由于您没有给出SP的全文,所以只能猜测。我的猜测是存储过程(或它调用的东西)在执行时将记录写入[SystemEventLog]

标签: sql sql-server sql-server-2008 sql-server-2005 sql-server-2008-r2


【解决方案1】:

分解该存储过程...

SELECT 1 FROM [SystemEventLog]
    WHERE [CreatedDateTime_UTC] >= CAST(@midnight AS DATE)
      AND [CreatedDateTime_UTC] < DATEADD(DD, 1, CAST(@midnight AS DATE))

如果满足该条件,这将输出一行(1 无关紧要 - 它只是内容)。

然后……

IF EXISTS ( [statement] ) 
如果[statement] 返回至少一行,则

为真。如果为真,则存储过程退出(通过RETURN 语句);如果为假,它将继续。

您的示例中缺少的部分将在此下方,然后它将在SystemEventLog 中添加一个新行,这将 - 在以后的执行中 - 然后在一天的剩余时间里设置true 条件。

【讨论】:

  • 好的。但是你怎么能判断这只会为这个特定的存储过程返回 1 呢?今天可能有不止一个 SQL 作业正在运行,它们也正在调用不同的存储过程。因此,今天的 [SystemEventLog] 中可能有条目。在这种情况下,如果我的存储过程没有运行,它也会返回 true?
  • 你说得很对,我错过了有语句插入值的部分,其中包含存储过程执行的名称和当前日期,但我不明白 SQL 查询将如何判断返回仅适用于这个存储过程,而不适用于其他存储过程?
  • @Dev 该查询中没有任何内容可以将其缩小到您的存储过程,但是回答这个新部分需要更多信息 - 例如,那些其他过程是否写入此表?如果他们这样做,他们肯定都会跑吗?
  • 我已经用我在检查后在那个 SP 中使用的插入语句更新了代码块。
  • @Dev 我有兴趣查看该表的内容,但这些 cmets 正在对原始问题进行一些扩展。但是,我想到了一些问题 - 1)所有其他程序是否都有相同的插入? 2) 上面的支票是一样的吗? 3) 他们真的都在运行吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-22
  • 2012-08-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多