SQLServer ストアドプロシージャで回帰テスト

#はじめに
ストアドプロシージャで回帰テストを実施したので書き留めたいと思います。

#実施するテスト内容
カーソルによる繰り返しの更新処理から、カーソルを使用しない更新への処理変更に伴う回帰テスト

```sql:修正前(カーソル使用)
DECLARE
	@column1	int,
	@column2	int,
	@column3	int,
    @Error		int

     SET @Error = 0

BEGIN
    BEGIN TRANSACTION

    DECLARE
        val_cursor CURSOR FAST_FORWARD FOR

		SELECT tableA.column1
			,tableA.column2
			,tableA.column3
		FROM tableA 
		JOIN tableB ON tableA.column1 = tableB.column1
		WHERE IsNull(tableA.column1, - 999999) <> IsNull(tableB.column1, - 999999)
			OR IsNull(tableA.column2, - 999999) <> IsNull(tableB.column2, - 999999)
			OR IsNull(tableA.column3, 'NULL') <> IsNull(tableB.column3, 'NULL')
		ORDER BY tableA.column1

    OPEN val_cursor
    FETCH NEXT FROM val_cursor INTO
        @column1,
        @column2,
        @column3

    WHILE @@fetch_status = 0
    BEGIN

		UPDATE tableB
		SET column2 = @column2
			,column3 = @column3
		WHERE column1 = @column1

        IF @@ERROR <> 0
            SET @Error = 1

        FETCH NEXT FROM val_cursor INTO
            @column1,
            @column2,
            @column3
    END

    CLOSE val_cursor
    DEALLOCATE val_cursor

    ROLLBACK TRANSACTION
END
```

```sql:修正後(カーソル未使用)
BEGIN
    BEGIN TRANSACTION
		UPDATE tableB
		SET column2 = tableA.column2
			,column3 = tableA.column3
		FROM tableA 
		JOIN tableB ON tableA.column1 = tableB.column1
		WHERE IsNull(tableA.column2, - 999999) <> IsNull(tableB.column2, - 999999)
			OR IsNull(tableA.column3, 'NULL') <> IsNull(tableB.column3, 'NULL')
    ROLLBACK TRANSACTION
END
```

#テスト実施の流れ

##①データを退避する
```sql:①更新テーブルを退避する
SELECT *
INTO result1
FROM tableB
```

##②ストアドプロシージャの修正
修正前の更新結果と、修正後の更新結果を退避する。

```sql:②ストアドプロシージャの修正
DECLARE
	@column1	int,
	@column2	int,
	@column3	int,
    @Error		int

     SET @Error = 0

BEGIN
    BEGIN TRANSACTION

    DECLARE
        val_cursor CURSOR FAST_FORWARD FOR

		SELECT tableA.column1
			,tableA.column2
			,tableA.column3
		FROM tableA 
		JOIN tableB ON tableA.column1 = tableB.column1
		WHERE IsNull(tableA.column1, - 999999) <> IsNull(tableB.column1, - 999999)
			OR IsNull(tableA.column2, - 999999) <> IsNull(tableB.column2, - 999999)
			OR IsNull(tableA.column3, 'NULL') <> IsNull(tableB.column3, 'NULL')
		ORDER BY tableA.column1

    OPEN val_cursor
    FETCH NEXT FROM val_cursor INTO
        @column1,
        @column2,
        @column3

    WHILE @@fetch_status = 0
    BEGIN

        --修正前の更新結果をresult1 に退避
        UPDATE result1
        SET column2 = @column2
            ,column3 = @column3
        WHERE column1 = @column1

        IF @@ERROR <> 0
            SET @Error = 1

        FETCH NEXT FROM val_cursor INTO
            @column1,
            @column2,
            @column3
    END

    CLOSE val_cursor
    DEALLOCATE val_cursor
 
    --修正版のクエリ
    UPDATE tableB
    SET column2 = tableA.column2
        ,column3 = tableA.column3
    FROM tableA 
    JOIN tableB ON tableA.column1 = tableB.column1
    WHERE IsNull(tableA.column2, - 999999) <> IsNull(tableB.column2, - 999999)
        OR IsNull(tableA.column3, 'NULL') <> IsNull(tableB.column3, 'NULL')

    --修正版の更新結果をresult2に退避
    SELECT *
    INTO result2
    FROM tableB

    ROLLBACK TRANSACTION
END
```

##③実行したテーブルの差分チェック
```sql:差分0ならOK
SELECT * FROM result1
EXCEPT
SELECT * FROM result2

SELECT * FROM result2
EXCEPT
SELECT * FROM result1
```