1

Sybase DBから行のブロックをフェッチしようとしています(つまり、トランザクションごとに一度に100行をフェッチします)。

ただし、T-SQLはこれをサポートしていないことをここここで読みました。

これに対する回避策はありますか?

また、一度に複数の行をフェッチできる場合、次のコードを変更してそれを行うにはどうすればよいですか?

DECLARE my_cursor CURSOR FOR
    SELECT
        COL1,
        COL2,
        ...
        COLN
    FROM
        MY_DB
    WHERE
        SOME_CONDITION_SATISFIED
GO

DECLARE
  VAR1 TYPE,
  VAR2 TYPE,
  ...
  VARN TYPE

    SET NO COUNT ON

    OPEN my_cursor
    WHILE @@SQLSTATUS = 0
    BEGIN
        FETCH my_cursor into
            @VAR1,
            @VAR2,
            ...
            @VARN
    END

CLOSE my_cursor
DEALLOCATE CURSOR my_cursor

どんな助けでもいただければ幸いです。

4

2 に答える 2

2

データベースプログラマーにとって、SQL ServerはカーソルをSybaseと同じように扱い、コードに問題はありません。T-SQLでは、基本的に、サーバーが物理行をフェッチしてカーソルを設定するペースを制御できません。プログラマーの観点からは、それは問題ではありません。

ネットワークの使用をこのようにきめ細かく制御する必要がある場合は、SSISなどのETLプロセスにより適した他のAPIを使用することをお勧めします。

ただし、開いているトランザクションが原因でデータベースの競合を防ぐことが問題である場合は、次のように、transaction isollation level read uncommitted(テーブルをロックしないで)使用するか、カウンターを使用してトランザクション管理ロジックを挿入できます。

....
DECLARE @counter INT; SET @counter = 0;
BEGIN TRANSACTION; -- OPEN THE FIRST TRANSACTION
OPEN my_cursor
WHILE @@SQLSTATUS = 0
BEGIN
    -- control transactions: commit at every 100 and opens another transaction
    IF @counter > 99
    BEGIN
        SET @counter = 0;
        COMMIT TRANSACTION;
        BEGIN TRANSACTION;
    END
    ELSE SET @counter = @counter +1;

    FETCH my_cursor into
        @VAR1,
        @VAR2,
        ...
        @VARN
END
COMMIT TRANSACTION; -- CLOSE THE LAST TRANSACTION
....
于 2012-08-09T14:13:46.413 に答える
0

sybaseでは一度に複数の行をフェッチできます。以下を使用して、一度に100行をフェッチします

set cursor rows 100 for cursor_name
于 2012-10-11T16:14:34.713 に答える