Как реализовать пакетную обработку в операторе выбора внутри курсора - PullRequest
0 голосов
/ 21 июня 2019

У меня есть 100000 записей в моей БД, мне нужно ВЫБРАТЬ данные в пакетном режиме. Поэтому мне нужно реализовать пакетную обработку (10000 записей на оператор выбора) внутри курсора, но я не могу это сделать. Когда я пытаюсь сделать то же самое без CURSOR, он работает нормально, но с CURSOR он работает не так, как ожидалось. Некоторые могут сообщить мне, что я пропускаю.

DECLARE @user_id Varchar(50), @user_nid bigInt, @userId Varchar(50), @userNid bigInt;

DECLARE @id_control INT, @batchSize INT, @row_count INT
DECLARE @company_id Varchar(50),@company_nid bigInt;

SET @row_count = 1      -- Stores the row count after each successful batch
SET @batchSize = 10     -- How many rows you want to operate on each batch
SET @id_control = 0     -- Current batch 

WHILE (@row_count > 0) 
BEGIN               
    DECLARE user_cursor CURSOR FOR 
            SELECT row_number, user_nid, user_id FROM
                (
                    SELECT DISTINCT user_nid, user_id, DENSE_RANK() OVER (ORDER BY user_nid) AS row_number 
                    FROM users with (NOLOCK) 
                    INNER JOIN  sometable WITH (NOLOCK) ON user_nid = ui_frn_user_nid 
                    WHERE 
                    some condition goes here
                ) AS userVal
                WHERE
                row_number > @id_control
                AND row_number <= @id_control + @batchSize 
                ORDER BY user_nid
    OPEN user_cursor

    FETCH NEXT FROM user_cursor 
    INTO @row_count, @user_nid, @user_id

    WHILE @@FETCH_STATUS = 0
        BEGIN
            SELECT @row_count AS RC, @user_nid, @user_id, @id_control AS IC, @batchSize AS BATCHSZE;
        FETCH NEXT FROM user_cursor 
        INTO @row_count, @user_nid, @user_id
    END

 SET @row_count = @@ROWCOUNT  -- To obtain the latest rowcount to avoid infinite loops
 SET @id_control = @id_control + @batchSize     -- Next Batch
 SELECT @row_count, @id_control;
 END
CLOSE user_cursor;
DEALLOCATE user_cursor;


I have tried it without cursor and i am getting the expected result,but with cursor i am getting the exact data which i declare in @batchSize (for example if i give the size as @batchSize =10,i am getting only 10 records.),please some one let me know what i am missing out.
...