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
是主键,并且是自动递增的。该表中的记录按SourceId
和CaptureBatch
分组。一个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
语句。
答案 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