2017-09-29 11 views
2

SQL一時テーブルにあるデータをストアドプロシージャに1つずつ渡すためのループを作成する必要があります。以下の方法を使用しても問題ありませんか?それはたくさんの記憶を必要としますか?オフセット&フェッチ次はループで使用するのに問題ありませんか?

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 
+0

これは動作するクエリですか? – Squirrel

+1

@ Squirrel-はい、動作しています:https://imgur.com/a/DYKKX。また、私の知識によると、この構文はSQL Server 2012の後にのみサポートされます – Spider

+3

ちょうどカーソルを使用します。それらはテーブルを反復するように設計されています。 –

答えて

1

私はテーブルsomeDataが、それが遅くなりますビッグデータである場合は、しばらく後に再度(SELECT COUNT(同上)@SomeData FROM)する必要はありませんだと思います。次のように試すことができます:

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

はい、それは受け入れられます。しかし、実際の質問は、私のためではありませんループ内のクエリを使用するかどうかより多くのコスト。とにかく、それを指してくれてありがとう.. – Spider

関連する問題