【发布时间】: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