【问题标题】:How to execute stored procedure while batching?批处理时如何执行存储过程?
【发布时间】:2016-03-11 20:44:26
【问题描述】:

我想通过从表中传递参数值来执行存储过程,批量大小为 100。一旦对第一批 100 进行存储过程调用,就转到下一批 100 并重复直到所有行在表中完成。该表有一列将得到更新,以确保在我这样做时不会拾取同一行

select top (batch_size) * 
from table

我的问题更多是关于如何为存储过程调用实现批处理。

编辑:添加了 OP 的评论:

例如,下面的 table1 有 1000 行。我的第一批是 500 行。为每一行调用一个存储过程。

CREATE TABLE table1 
(
    id INT IDENTITY, 
    col1 VARCHAR(100), 
    status VARCHAR(50)
) 

DECLARE @batch_size INT 
SET @batch_size = 5 

INSERT INTO table2 
    SELECT TOP(500) col1 
    FROM table1 
    WHERE status IS NULL 
    ORDER BY id 

SELECT TOP(1) 
    @id = id, @col1 = col1, @col2 = col2 
FROM table2 
ORDER BY id 

WHILE @@rowcount > 0  
BEGIN 
     EXEC SP param1 = col1, param2 = col2 

     UPDATE table1 
     SET status = 'closed' 

     SELECT TOP(1) @id = id, @col1 = col1, @col2 = col2 
     FROM table2 
     WHERE id > @id 
     ORDER BY id 
END

【问题讨论】:

  • 你能发布一些 ddl、示例数据、proc 代码以及你想要做什么吗?如果没有这些细节,我们只是猜测。
  • 您所说的“通过从表中传递参数值来执行 SP,批量大小为 100”是什么意思?您的存储过程一次需要 100 个参数值?
  • --例如,下面的 table1 有 1000 行。我的第一批是 500 行。对每一行进行一次 SP 调用。 CREATE TABLE table1 (id INT IDENTITY, col1 VARCHAR(100), status VARCHAR(50)) DECLARE @batch_size INT SET @batch_size=5 INSERT INTO table2 SELECT TOP(500) col1 FROM table1 WHERE status is NULL ORDER BY id SELECT TOP( 1) @id=id @col1=col1,@col2= col2 FROM table2 ORDER BY id WHILE @@rowcount >0 BEGIN EXEC SP param1=col1, param2=col2 UPDATE table1 SET status='closed' SELECT TOP(1) @ id=id @col1=col1,@col2= col2 FROM table2 WHERE id >@id ORDER BY id END
  • 前 500 行完成后。如何选择接下来的 500 行?
  • 如果您为每一行进行一次 SP 调用,为什么要分批进行呢?您认为您会获得一些性能优势吗?

标签: sql sql-server sql-server-2012


【解决方案1】:

我并不是说你要这样做是最好的方法,但要回答你的问题,你可以简单地将现有代码放在一个 WHILE 循环中进行检查

 WHILE EXISTS(SELECT * FROM Table1 WHERE Status IS NULL)

您的代码将一次获得 500 行的批次,直到 Table1 中没有更多行的状态为 NULL。

【讨论】:

    猜你喜欢
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-30
    相关资源
    最近更新 更多