Offset & Fetch Next 可以循环使用吗?

问题描述 投票:0回答:2

我需要编写一个循环,将 SQL 临时表上的数据一一传递给存储过程。使用下面的方法可以吗?会消耗大量内存吗?

DECLARE @SomeData AS TABLE(
    Id      INT,
    Name    VARCHAR(MAX),
    Age     INT
)

INSERT INTO @SomeData
        ( Id, Name, Age )
VALUES  ( 1, 'AAAAA', 10 ),
        ( 2, 'BBBBB', 12 ),
        ( 3, 'CCCCC', 13 ),
        ( 4, 'DDDDD', 14 ),
        ( 5, 'EEEEE', 15 );

DECLARE @iterator INT = 0

WHILE @iterator< (SELECT COUNT(Id) FROM @SomeData)
BEGIN
    SELECT * 
    FROM @SomeData
    ORDER BY Id 
    OFFSET @iterator ROWS
    FETCH NEXT 1 ROWS ONLY

    SET @iterator +=1


    /*Execute a Stored Procedure*/
END
sql sql-server loops stored-procedures
2个回答
3
投票

我认为你不需要稍后再次 (SELECT COUNT(Id) FROM @SomeData) ,如果表 SomeData 是大数据,它会变慢。你可以这样尝试:

DECLARE @iterator INT = 0
declare @n int = (SELECT COUNT(Id) FROM @SomeData)
WHILE @iterator< @n
BEGIN
    SELECT * 
    FROM @SomeData
    ORDER BY Id 
    OFFSET @iterator ROWS
    FETCH NEXT 1 ROWS ONLY

    SET @iterator +=1


    /*Execute a Stored Procedure*/
END

0
投票

表变量只能用于少量行。 <100. So a query retrieving 1 row from a small table will have almost zero impact on any resource including memory. If using a temp table #Tbl (if bigger row count needed) rather than @Tbl, use an Identity column Primary Key and do similar to above but

CREATE TABLE #Tbl ID int IDENTITY(1,1) Primary Key, col1)
DECLARE @iterator INT = 0, @col1value varchar(10)
declare @n int = (SELECT COUNT(Id) FROM #Tbl)
WHILE @iterator< @n
BEGIN
SELECT @col1value = col1 
FROM #Tbl
WHERE Id = @iterator

/*Execute a Stored Procedure*/
EXEC test @col1value
SET @iterator +=1
END
© www.soinside.com 2019 - 2024. All rights reserved.