0

複雑なロジックに基づいて複数のテーブル間でレコードを移動する複雑なストアドプロシージャを作成しました。ロジックの各部分を注意深くチェックしましたが、コードに最大限の信頼を置きたいと思います。SPの開始と終了の間に保持する必要がある論理関係を宣言する方法はありますか?これらの条件が満たされない場合、SPはロールバックされると思います。

具体的には、論理条件のセットによって選択されたテーブルAのレコードは、SPの最後のテーブルB(テーブルAではなく)にあり、それらの論理条件のセットによって選択されていないレコードであることを宣言したいと思います。条件は、SPの終了時にテーブルXに残ります。ブール関数を使用して、条件に一致するAのレコードを選択します。

これらのいくつかをnUnitでテストできることは知っていますが、t-SQL自体の中でこの種のロジックを宣言して適用する方法があるかどうか疑問に思っています。

4

1 に答える 1

1

レコードに一意のIDを含むフィールドがある場合は、TableAからTableBに単純なINSERT+を実行してから、挿入された元のレコードの単純な+を実行できます。SELECTDELETE

たとえば、最初に選択基準に一致するすべてのレコードをTableBに挿入します。

INSERT INTO TableB (uniqueID, Field1, Field2, FieldN)
SELECT uniqueID,
       Field1,
       Field2,
       FieldN
FROM   TableA
WHERE  FieldN = SomeCriteria

次に、削除するレコードを決定するための選択基準としてフィールドuniqueIDを使用して、tableBに挿入したばかりのすべてのレコードをTableAから削除します。

DELETE TableA
WHERE  uniqueID IN (SELECT uniqueID
                    FROM   TableB)

いくつかのエラーチェックを使用して両方のステートメントを1つのトランザクションに入れる場合、2つのステートメントの実行中に問題が発生した場合に備えて保護する必要があります。

BEGIN TRANSACTION

INSERT INTO TableB (uniqueID, Field1, Field2, FieldN)
SELECT uniqueID,
       Field1,
       Field2,
       FieldN
FROM   TableA
WHERE  FieldN = SomeCriteria;

IF @@ERROR <> 0 THEN
BEGIN
    ROLLBACK TRANSACTION
    RETURN (@@ERROR)
END

DELETE TableA
WHERE  uniqueID IN (SELECT uniqueID
                    FROM   TableB);
if @@ERROR <> 0 THEN
BEGIN
    ROLLBACK TRANSACTION
    RETURN (@@ERROR)
END

COMMIT TRANSACTION 

TableAからレコードを選択するEXISTS代わりに使用できる各レコードを一意に識別できる単一の列がない場合は、次のようにします。INDELETE

DELETE TableA
WHERE  EXISTS (SELECT *
               FROM   TableB
               WHERE  TableA.field1 = TableB.field1
                      AND TableA.field2 = TableB.field2
                      AND TableA.FieldN = TableB.fieldn);
于 2013-02-06T03:32:51.800 に答える