修改SQL Server存储过程以在执行Update语句之前检查条件

时间:2018-09-16 20:26:23

标签: sql-server stored-procedures

Azure SQL Server-我有一个异步运行的继承存储过程,该存储过程由无限运行的Azure Service Fabric服务触发:

PROCEDURE Sources.ForIndexing
    (@SourceId BIGINT)
AS
BEGIN
    SET NOCOUNT ON

    DECLARE @BatchId uniqueidentifier

    SELECT @BatchId = CaptureBatch
    FROM [Data].[Raw]
    WHERE CaptureId = (SELECT MAX(CaptureId)
                       FROM [Data].[Raw]
                       WHERE SourceId = @SourceId)

    UPDATE [Data].[Raw]
    SET [Status] = 501
    WHERE SourceId = @SourceId
      AND CaptureBatch = @BatchId
END
GO

在此Data.Raw表中,CaptureId是主键,并且是自动递增的。该表中的记录按SourceIdCaptureBatch分组。一个SourceId可以有多个CaptureBatch's。该过程的第一部分通过查看给定CaptureBatch中的MAX CaptureId来找到最新的SourceId组。然后,UPDATE语句将这些记录的Status列设置为501。

我需要做的是向存储过程添加一个条件,在该条件下,在SELECT语句运行后,如果该过程对其进行迭代的任何给定记录的Status列的值为1,则执行< strong>不在该记录上执行UPDATE语句。

我认为这可能就像修改SELECT部分​​这样简单:

WHERE CaptureId = (SELECT MAX(CaptureId)
                   FROM [Data].[Raw]
                   WHERE SourceId = @SourceId
                     AND Status <> 1)

但是我相信,对于包含Status MAX一个记录,只会选择一个非1的CaptureId,对吗?我可能对此想法有点过头,但是似乎我需要在其中添加某种IF语句。

2 个答案:

答案 0 :(得分:1)

SELECT TOP (1)
   @BatchId = r.CaptureBatch
FROM [Data].[Raw] r
WHERE r.SourceId = @SourceId
ORDER BY r.CaptureId DESC

UPDATE r SET 
   [Status] = 501
FROM [Data].[Raw] r
WHERE r.SourceId = @SourceId
  AND r.CaptureBatch = @BatchId
  AND r.Status <> 1

答案 1 :(得分:0)

IF (SELECT count(CaptureId)
                       FROM [Data].[Raw]
                       WHERE SourceId = @SourceId and Status = 1) > 0 BEGIN
 UPDATE [Data].[Raw]
    SET [Status] = 501
    WHERE SourceId = @SourceId
      AND CaptureBatch = @BatchId
END