Oracle から SQL Server に移行しており、BULK COLLECT INTO クエリが入力されたテーブル変数からクエリを変換しています。私はカーソルを使用することを考えています(間違いなく他の提案を受け入れます)が、使用しているクエリを処理するOracleコードでTable_var.FIRST
.NEXT
は.LAST
. これらをどのように使用しているかのサンプルコードを次に示します。最初/次/最後がテーブルvarのレコードにインデックスを与えているようです。
TYPE Pers_DOB_LastInitial IS RECORD (
Person_ID Person.Person_ID%TYPE,
DOB Person.Birthdate%TYPE,
LastInitial VARCHAR2(1)
);
TYPE Dup_Table IS TABLE OF Pers_DOB_LastInitial INDEX BY BINARY_INTEGER;
Dup_Tab Dup_Table;
これらの型を使用する関数:
FUNCTION Last_In_Group( pStart NUMBER, pDOB Person.Birthdate%TYPE, pLastInitial VARCHAR2 )
RETURN NUMBER IS
vResult NUMBER;
BEGIN
IF pStart = Dup_Tab.LAST THEN
RETURN pStart;
END IF;
vResult := pStart;
FOR vIndex IN pStart .. Dup_Tab.LAST LOOP
IF Dup_Tab.EXISTS( vIndex ) THEN
IF Dup_Tab( vIndex ).DOB = pDOB AND Dup_Tab( vIndex ).LastInitial = pLastInitial THEN
vResult := vIndex;
ELSE
EXIT;
END IF;
END IF;
END LOOP;
RETURN vResult;
END Last_In_Group;
コーディングを行う必要はありません。正しい方向に向けるだけでよいのです。カーソルを使用することを考えていますが、T-SQL でカーソルから次のレコードをフェッチするだけで、カーソル (または一時テーブル) の行インデックスを参照する同等の方法があるかどうかを知りたいだけです。 )。
EDIT:私はちょうど次のことを発見し、それを調べています。これが追求するのに適した方法なのか、それともカーソルの方が優れているのかについてのヒントは間違いなく開かれています。
http://www.sql-server-performance.com/2004/operations-no-cursors/2/
DECLARE @dupTab TABLE (
person_id numeric(8,0),
DOB date,
LastInitial char(1)
)
INSERT @dupTab
SELECT ...