代码之家  ›  专栏  ›  技术社区  ›  Stpete111

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

  •  0
  • Stpete111  · 技术社区  · 7 年前

    Azure SQL Server-我继承了一个异步运行的存储过程,由无限运行的Azure服务结构服务触发:

    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 是主键并自动递增。此表中的记录按 SourceId CaptureBatch . 一个 源ID 可以有几个 CaptureBatch's . 此过程的第一部分查找最新的 捕获批处理 通过查看 MAX 俘虏ID 一个给定的 UPDATE 语句然后设置 Status 把那些记录列到501。

    状态 此过程迭代的任何给定记录的列的值为1,do 执行 记录在案的声明。

    我想这可能很简单,只需修改SELECT部分:

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

    状态 那不是1 马克斯 俘虏ID ,对吗?我可能想得太多了,但似乎我需要一些 IF

    2 回复  |  直到 7 年前
        1
  •  1
  •   Ivan Starostin    7 年前
    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
    
        2
  •  0
  •   Vasya    7 年前
    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
    
    推荐文章