我有一个用于与另一个服务通信的现有存储过程。 此其他服务每5分钟最多可处理200个请求,因此存储过程最多设置为200行。
SELECT TOP 200
column1 as 'MESSAGE_A'
, column2 as 'MESSAGE_B'
, column3 as 'MESSAGE_C'
, CAST(request as xml)
FROM [table]
ORDER BY [priority] ASC, column1 ASC
FOR XML PATH ('result_xml'), TYPE, ROOT ('requests')
问题是,虽然程序每5分钟自动运行一次,但它也可以手动运行(因为客户端)。
如果手动执行提示请求超过200,则第三方会被塞进,并且进程崩溃。
如何添加支票,以便在5分钟的时间范围内最多选择200行?
答案 0 :(得分:0)
我们做了同样的事情(我们使用SSIS包每隔5分钟自动处理数据,有时需要手动运行该包)通过添加一个isprocessed列(默认为false)。
手动或自动,设置为true。所以下次每当我们记录时,删除isprocessed = true数据。
答案 1 :(得分:0)
我需要验证语法,但您的存储过程看起来像这样:
CREATE Procedure GetBatch AS
DECLARE @Rows INT
SELECT @Rows = 200 - Count(*) FROM [table] WHERE IsProcessing = 0
UPDATE TOP (@Rows) [table]
SET IsProcessing = 1
OUTPUT
INSERTED.column1 as 'MESSAGE_A'
, INSERTED.column2 as 'MESSAGE_B'
, INSERTED.column3 as 'MESSAGE_C'
, CAST(INSERTED.request as xml)
ORDER BY [priority] ASC, column1 ASC
FOR XML PATH ('result_xml'), TYPE, ROOT ('requests')
WHERE IsProcessing = 0
SQL Server中的一个巧妙技巧是可以使用OUTPUT子句组合SELECT和UPDATE语句。
请注意,您希望将其作为SERIALIZABLE事务运行。否则你可能仍会抓住太多行。