😩 毎回のデータパッチ、こんな悩みありませんか?
- データベースの修正作業で修正前後の比較SQLを書くのが面倒
- INSERT / UPDATE / DELETE のたびに似たようなSQLを毎回手書き
EXCEPTの列数が合わず、メッセージ205のエラーに悩まされる- テーブル名や条件を何度もコピペしてミスが起きやすい
- 差分のログがバラバラでレビューや検証がしづらい
今回は、こんな面倒な作業をテンプレート化できるVSCodeのスニペットを紹介したいと思います。
INSERT用/UPDATE用/DELETE用に分けて展開できるようにしたいと思います。
✅ 解決策:VS Codeスニペットで差分チェックを自動展開!
VS Codeのスニペット機能を使えば、 たった数秒で差分チェックSQLを展開できるようになります!
✨ スニペット導入のメリット
| Before(従来) | After(スニペット導入後) |
|---|---|
| 毎回SQLを手書き | insertdiff → Tab で即展開! |
| 列数不一致でエラー | 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"を変更すれば、 たとえばidiffやdiff-insertのように、自分の好みに合わせてカスタマイズできます!
3. テーブル名を入力する
スニペット内の ${1:YourTable} にテーブル名を入力すると、 すべての該当箇所に自動で反映されます!
4. 差分を確認する
修正前/修正後の状態をSELECTで確認- 差分は
'差分' AS 区分付きで表示され、ログにも残しやすい! ROLLBACKされるので、本番データは変更されません!
📚 差分チェックの流れ(INSERTの例)
#Beforeに変更前の状態を保存- INSERT文を実行(仮実行)
#Afterに変更後の状態を保存EXCEPTで差分を抽出'差分' AS 区分でログ出力を明示ROLLBACKで実データは変更されない!
🎉 おわりに
このスニペットを導入するだけで、 「毎回面倒だった差分チェック」が一瞬で終わるようになります!
- 作業ミスが減る
- 作業スピードが爆上がり
- チームで共有すれば全員ハッピー!
私も運用を始めたばかりなので、工夫すればもっと便利になるような気がします。

コメント