存储过程以在5分钟内选择最大行数

时间:2017-05-17 04:38:32

标签: sql-server

我有一个用于与另一个服务通信的现有存储过程。 此其他服务每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行?

2 个答案:

答案 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事务运行。否则你可能仍会抓住太多行。

更多信息:how can I Update top 100 records in sql server