【问题标题】:Stored Procedure to select max number of rows in 5 minutes存储过程在 5 分钟内选择最大行数
【发布时间】:2017-05-17 13:26:40
【问题描述】:

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

【问题讨论】:

  • 如果可以跟踪,服务被调用了多少时间,然后保持按日期调用的服务日志。这样,如果超过 200 个限制,您可以阻止调用服务直到 5 分钟。

标签: sql-server


【解决方案1】:

对于我们所做的相同的事情(我们使用 SSIS 包每 5 分钟自动处理一次数据,有时需要手动运行该包)通过添加列 isprocessed(默认为 false)。

无论是手动还是自动,它都设置为 true。所以下次我们记录时,删除 isprocessed=true 数据。

【讨论】:

    【解决方案2】:

    我需要验证语法,但您的存储过程看起来像这样:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-23
      • 1970-01-01
      • 2016-04-22
      • 2013-10-28
      • 2021-04-21
      • 1970-01-01
      • 1970-01-01
      • 2022-12-09
      相关资源
      最近更新 更多