スポンサーリンク
IT全般SQL Server

VS CodeスニペットでSQLパッチ作業の差分チェックを爆速&ミスゼロにする方法

IT全般
この記事は約11分で読めます。

😩 毎回のデータパッチ、こんな悩みありませんか?

  • データベースの修正作業で修正前後の比較SQLを書くのが面倒
  • INSERT / UPDATE / DELETE のたびに似たようなSQLを毎回手書き
  • EXCEPT の列数が合わず、メッセージ205のエラーに悩まされる
  • テーブル名や条件を何度もコピペしてミスが起きやすい
  • 差分のログがバラバラでレビューや検証がしづらい

今回は、こんな面倒な作業をテンプレート化できるVSCodeのスニペットを紹介したいと思います。
INSERT用/UPDATE用/DELETE用に分けて展開できるようにしたいと思います。

✅ 解決策:VS Codeスニペットで差分チェックを自動展開!

VS Codeのスニペット機能を使えば、 たった数秒で差分チェックSQLを展開できるようになります!

✨ スニペット導入のメリット

Before(従来)After(スニペット導入後)
毎回SQLを手書きinsertdiffTab で即展開!
列数不一致でエラーEXCEPT構文を統一してエラー回避!
テーブル名を何度も入力${1:YourTable} で1回入力するだけ!
差分表示がバラバラ'差分' AS 区分 でログ出力を統一!
作業ログが残らないSELECTで前後状態を明示!
修正前後の比較が面倒テンプレートに組み込み済みで即確認!

🛠️ 導入手順

① .vscode フォルダを作成

mkdir .vscode

② sqldiff.code-snippets を作成

.vscode/sqldiff.code-snippets という名前でファイルを作成し、以下の内容を貼り付けます。

{
  "Insert Diff Check": {
    "prefix": "insertdiff",
    "body": [
      "SET XACT_ABORT ON;",
      "",
      "-- 一時テーブルの事前削除",
      "IF OBJECT_ID('tempdb..#Before') IS NOT NULL DROP TABLE #Before;",
      "IF OBJECT_ID('tempdb..#After') IS NOT NULL DROP TABLE #After;",
      "",
      "BEGIN TRANSACTION;",
      "",
      "-- INSERT前の状態を取得",
      "SELECT * INTO #Before FROM ${1:YourTable};",
      "SELECT '修正前' AS 区分, * FROM #Before;",
      "SELECT COUNT(*) AS 件数 FROM #Before;",
      "",
      "-- INSERT処理(ここにINSERT文を記述)",
      "",
      "",
      "",
      "-- INSERT後の状態を取得",
      "SELECT * INTO #After FROM ${1};",
      "SELECT '修正後' AS 区分, * FROM #After;",
      "SELECT COUNT(*) AS 件数 FROM #After;",
      "",
      "-- 差分抽出(追加された行)",
      "SELECT '差分' AS 区分, * FROM (",
      "  SELECT * FROM #After",
      "  EXCEPT",
      "  SELECT * FROM #Before",
      ") AS 差分;",
      "",
      "-- 差分件数",
      "SELECT COUNT(*) AS 件数 FROM (",
      "  SELECT * FROM #After",
      "  EXCEPT",
      "  SELECT * FROM #Before",
      ") AS 差分;",
      "",
      "ROLLBACK TRANSACTION;",
      "",
      "-- 一時テーブルの後処理",
      "IF OBJECT_ID('tempdb..#Before') IS NOT NULL DROP TABLE #Before;",
      "IF OBJECT_ID('tempdb..#After') IS NOT NULL DROP TABLE #After;"
    ],
    "description": "INSERT前後の差分チェックテンプレート"
  },

  "Update Diff Check": {
    "prefix": "updatediff",
    "body": [
      "SET XACT_ABORT ON;",
      "",
      "-- 一時テーブルの事前削除",
      "IF OBJECT_ID('tempdb..#Before') IS NOT NULL DROP TABLE #Before;",
      "IF OBJECT_ID('tempdb..#After') IS NOT NULL DROP TABLE #After;",
      "",
      "BEGIN TRANSACTION;",
      "",
      "-- UPDATE前の状態を取得",
      "SELECT * INTO #Before FROM ${1:YourTable};",
      "SELECT '修正前' AS 区分, * FROM #Before;",
      "SELECT COUNT(*) AS 件数 FROM #Before;",
      "",
      "-- UPDATE処理(ここにUPDATE文を記述)",
      "",
      "",
      "",
      "-- UPDATE後の状態を取得",
      "SELECT * INTO #After FROM ${1};",
      "SELECT '修正後' AS 区分, * FROM #After;",
      "SELECT COUNT(*) AS 件数 FROM #After;",
      "",
      "-- 差分抽出(変更前)",
      "SELECT '差分' AS 区分, * FROM (",
      "  SELECT * FROM #Before",
      "  EXCEPT",
      "  SELECT * FROM #After",
      ") AS 差分;",
      "",
      "-- 差分抽出(変更後)",
      "SELECT '差分' AS 区分, * FROM (",
      "  SELECT * FROM #After",
      "  EXCEPT",
      "  SELECT * FROM #Before",
      ") AS 差分;",
      "",
      "ROLLBACK TRANSACTION;",
      "",
      "-- 一時テーブルの後処理",
      "IF OBJECT_ID('tempdb..#Before') IS NOT NULL DROP TABLE #Before;",
      "IF OBJECT_ID('tempdb..#After') IS NOT NULL DROP TABLE #After;"
    ],
    "description": "UPDATE前後の差分チェックテンプレート"
  },

  "Delete Diff Check": {
    "prefix": "deletediff",
    "body": [
      "SET XACT_ABORT ON;",
      "",
      "-- 一時テーブルの事前削除",
      "IF OBJECT_ID('tempdb..#Before') IS NOT NULL DROP TABLE #Before;",
      "IF OBJECT_ID('tempdb..#After') IS NOT NULL DROP TABLE #After;",
      "",
      "BEGIN TRANSACTION;",
      "",
      "-- DELETE前の状態を取得",
      "SELECT * INTO #Before FROM ${1:YourTable};",
      "SELECT '削除前' AS 区分, * FROM #Before;",
      "SELECT COUNT(*) AS 件数 FROM #Before;",
      "",
      "-- DELETE処理(ここにDELETE文を記述)",
      "",
      "",
      "",
      "-- DELETE後の状態を取得",
      "SELECT * INTO #After FROM ${1};",
      "SELECT '削除後' AS 区分, * FROM #After;",
      "SELECT COUNT(*) AS 件数 FROM #After;",
      "",
      "-- 差分抽出(削除された行)",
      "SELECT '差分' AS 区分, * FROM (",
      "  SELECT * FROM #Before",
      "  EXCEPT",
      "  SELECT * FROM #After",
      ") AS 差分;",
      "",
      "-- 差分件数",
      "SELECT COUNT(*) AS 件数 FROM (",
      "  SELECT * FROM #Before",
      "  EXCEPT",
      "  SELECT * FROM #After",
      ") AS 差分;",
      "",
      "ROLLBACK TRANSACTION;",
      "",
      "-- 一時テーブルの後処理",
      "IF OBJECT_ID('tempdb..#Before') IS NOT NULL DROP TABLE #Before;",
      "IF OBJECT_ID('tempdb..#After') IS NOT NULL DROP TABLE #After;"
    ],
    "description": "DELETE前後の差分チェックテンプレート"
  }
}

🧪 スニペットの使い方(実務フローに沿った手順)

1. .sql ファイルを新規作成する

VSCodeを開いて、パッチ作業用に .sql ファイルを作成します。

例:2026-02-25_商品マスタ修正.sql

2. スニペットを展開する

以下のように入力して Tab キーを押すと、スニペットが展開されます:

操作内容入力するキーワード(prefix)
INSERT の差分チェックinsertdiff
UPDATE の差分チェックupdatediff
DELETE の差分チェックdeletediff

tabキーを押すと設定したスニペット内容が展開されます。

SET XACT_ABORT ON;

-- 一時テーブルの事前削除
IF OBJECT_ID('tempdb..#Before') IS NOT NULL DROP TABLE #Before;
IF OBJECT_ID('tempdb..#After') IS NOT NULL DROP TABLE #After;

BEGIN TRANSACTION;

-- DELETE前の状態を取得
SELECT * INTO #Before FROM YourTable;
SELECT '削除前' AS 区分, * FROM #Before;
SELECT COUNT(*) AS 件数 FROM #Before;

-- DELETE処理(ここにDELETE文を記述)



-- DELETE後の状態を取得
SELECT * INTO #After FROM YourTable;
SELECT '削除後' AS 区分, * FROM #After;
SELECT COUNT(*) AS 件数 FROM #After;

-- 差分抽出(削除された行)
SELECT '差分' AS 区分, * FROM (
  SELECT * FROM #Before
  EXCEPT
  SELECT * FROM #After
) AS 差分;

-- 差分件数
SELECT COUNT(*) AS 件数 FROM (
  SELECT * FROM #Before
  EXCEPT
  SELECT * FROM #After
) AS 差分;

ROLLBACK TRANSACTION;

-- 一時テーブルの後処理
IF OBJECT_ID('tempdb..#Before') IS NOT NULL DROP TABLE #Before;
IF OBJECT_ID('tempdb..#After') IS NOT NULL DROP TABLE #After;

💡 補足:キーワード(prefix)は自由に変更可能! sqldiff.code-snippets"prefix" を変更すれば、 たとえば idiffdiff-insert のように、自分の好みに合わせてカスタマイズできます!

3. テーブル名を入力する

スニペット内の ${1:YourTable} にテーブル名を入力すると、 すべての該当箇所に自動で反映されます!

4. 差分を確認する

  • 修正前 / 修正後 の状態を SELECT で確認
  • 差分は '差分' AS 区分 付きで表示され、ログにも残しやすい!
  • ROLLBACK されるので、本番データは変更されません!

📚 差分チェックの流れ(INSERTの例)

  1. #Before に変更前の状態を保存
  2. INSERT文を実行(仮実行)
  3. #After に変更後の状態を保存
  4. EXCEPT で差分を抽出
  5. '差分' AS 区分 でログ出力を明示
  6. ROLLBACK で実データは変更されない!

🎉 おわりに

このスニペットを導入するだけで、 「毎回面倒だった差分チェック」が一瞬で終わるようになります!

  • 作業ミスが減る
  • 作業スピードが爆上がり
  • チームで共有すれば全員ハッピー!

私も運用を始めたばかりなので、工夫すればもっと便利になるような気がします。

コメント

タイトルとURLをコピーしました