動くコード図鑑技術記事現場の渡り方キャリア論すべての記事About

動くコード図鑑

$ ls -1 /library | wc -l → 619

触って動く、検証済みの正解集。

公開記事から抽出した全コードブロックを 1 つずつページ化。 ▶ ボタンで 実行ログを再生し、 さも今動いてるかのように出力を流す。

この図鑑の使い方

言語で絞る

C# / SQL / TypeScript / PowerShell / Bash でフィルタ。

▶ で実行

事前収録の出力を 1 行ずつ再生。 ぱっと結果が見える。

記事と接続

各 snippet は出典記事へのリンク付き。 文脈ごと読める。

絞り込み

snippet 一覧

31
SQL
-- ✅定石5-a: datetimeとdatetime2の精度差
DECLARE @dt1 datetime  = '2026-05-08 14:30:00.123';
DECLARE @dt2 datetime2 = '2026-05-08 14:30:00.123';

SELECT @dt1 AS dt_value, @dt2 AS dt2_value;
▶ 実行可

定石5: SQL Server datetime vs datetime2 —業務系JOIN事故の温床

C# DateTime と DateTimeOffset の違い・タイムゾーン処理の正解(業務SE本番事故編)#b343acd30a08
SQL
select *
from Company as a
inner join Employees as b
on(a.EmployeeId = b.Id)
where a.Id = @id
▶ 実行可

IncludeはSqlでいうところのJoinをして返してくれる

Asp.Net Core ApiのIncludeの使い方で盛大な勘違いをしていた件#a97d06bbb82f
SQL
-- 既存行があるテーブルに NOT NULL + 定数デフォルトを足す
CREATE TABLE dbo.受注 (受注ID int PRIMARY KEY, 金額 int);
INSERT INTO dbo.受注 VALUES (1, 1000), (2, 2000);
GO

▶ 実行可

1. NOT NULL + デフォルト値の組み合わせで挙動が割れる

SQL Server で本番テーブルにカラムを追加する時、業務SEが気をつける3つのこと#d2eedd1ebe08
SQL
-- 可変長NULLは即時・既存行のサイズも据え置き(値が入るまで増えない)
ALTER TABLE dbo.受注 ADD 備考 varchar(200) NULL;

-- computed 列は実体を持たず、読むたびに計算される(PERSISTED 指定時を除く)
ALTER TABLE dbo.受注 ADD 税込 AS (金額 * 1.1);
▶ 実行可

3. 可変長・固定長・computed 列で挙動とサイズが変わる

SQL Server で本番テーブルにカラムを追加する時、業務SEが気をつける3つのこと#b63061dcf931
SQL
-- ❌カーソル+変数累積
DECLARE @total DECIMAL(18,2)= 0;
-- ...カーソル省略... SET @total = @total + @amount;

-- ✅ GROUP BY一発
▶ 実行可

2.集計(SUM / COUNT / AVG)

SQL Server のカーソルを使うべきタイミングと書き方(業務SE現場の判断軸)#003642727eff
SQL
-- ✅ウィンドウ関数で一発
SELECT
    customer_id,
    purchase_date,
    amount,
▶ 実行可

3.ランキング(ROW_NUMBER / RANK)

SQL Server のカーソルを使うべきタイミングと書き方(業務SE現場の判断軸)#26525d4eb78c
SQL
-- ✅カーソル基本テンプレ
DECLARE @table_name SYSNAME;
DECLARE @sql NVARCHAR(MAX);

DECLARE meta_cursor CURSOR LOCAL FAST_FORWARD READ_ONLY FOR
▶ 実行可

カーソルの正しい書き方(DECLARE〜DEALLOCATEのテンプレ)

SQL Server のカーソルを使うべきタイミングと書き方(業務SE現場の判断軸)#50ab94bf4bc6
SQL
SET SHOWPLAN_TEXT ON;
GO
SELECT * FROM dbo.tmp_orders WHERE customer_id = 1;
GO
SET SHOWPLAN_TEXT OFF;
▶ 実行可

SET SHOWPLAN_TEXTで実行計画を取る

SQL Server 実行計画の読み方 — Estimated vs Actual で業務SE が最初に見る5箇所#73565946edca
SQL
--準備:通常テーブル+インデックス+ 1万件投入+統計更新
IF OBJECT_ID('dbo.tmp_orders','U')IS NOT NULL DROP TABLE dbo.tmp_orders;
CREATE TABLE dbo.tmp_orders (id INT IDENTITY PRIMARY KEY, customer_id INT, amount INT);
CREATE INDEX IX_customer ON dbo.tmp_orders(customer_id);

▶ 実行可

ハンズオン#1 — Index Seekが出るケース

SQL Server 実行計画の読み方 — Estimated vs Actual で業務SE が最初に見る5箇所#862ed5c3d05c
SQL
SET STATISTICS PROFILE ON;
SELECT * FROM dbo.tmp_orders WHERE customer_id = 1;
SET STATISTICS PROFILE OFF;
▶ 実行可

② Estimated rowsとActual rowsの乖離

SQL Server 実行計画の読み方 — Estimated vs Actual で業務SE が最初に見る5箇所#2094ae3368eb
SQL
-- 全 INDEX の断片化を一発で返す (SAMPLED モード)
SELECT
    OBJECT_NAME(ps.object_id) AS table_name,
    si.name                   AS index_name,
    si.type_desc              AS index_type,
▶ 実行可

罠①: 断片化率と page_count の見方

業務 SE が SQL Server INDEX 断片化に手を出す前に見る 3 箇所 — REBUILD / REORGANIZE / 放置の判断軸#a957935a3f52
SQL
-- 現在のロック保持状況 (Sch-M / Sch-S を含む)
SELECT
    request_session_id      AS session_id,
    resource_type,
    resource_associated_entity_id,
▶ 実行可

罠 2-c: Sch-M ロックは ONLINE でも瞬間発生する

業務 SE が SQL Server INDEX 断片化に手を出す前に見る 3 箇所 — REBUILD / REORGANIZE / 放置の判断軸#20036fe3c264
SQL
-- 全 INDEX の fill factor 現状
SELECT
    OBJECT_NAME(i.object_id) AS table_name,
    i.name                   AS index_name,
    i.type_desc              AS index_type,
▶ 実行可

fill factor の現状確認 SQL

業務 SE が SQL Server INDEX 断片化に手を出す前に見る 3 箇所 — REBUILD / REORGANIZE / 放置の判断軸#ace9ba4117bf
SQL
-- これは罠
SELECT * FROM Sessions WHERE SessionId = @sid OPTION (RECOMPILE);
-- ↑ 1秒に100回叩かれる SELECT に付けると、コンパイル時間が積み重なって CPU が爆上がり
▶ 実行可

なぜ「とりあえずRECOMPILE」が逆効果になるのか

SQL Server で OPTION(RECOMPILE) を脳死で付けて遅くなった話#6c4d462b81b8
SQL
SELECT OrderId, CustomerId, TotalAmount
  FROM Orders
 WHERE OrderId = @orderId;
▶ 実行可

パターン1: RECOMPILE不要(主キー一発引き・プランキャッシュで十分)

SQL Server で OPTION(RECOMPILE) を脳死で付けて遅くなった話#2dfc6b7f28b4
SQL
SELECT OrderId, CustomerId, OrderDate
  FROM Orders
 WHERE Status = @status
 OPTION (RECOMPILE);
▶ 実行可

パターン2: RECOMPILEが効く(パラメータ依存性高)

SQL Server で OPTION(RECOMPILE) を脳死で付けて遅くなった話#2118b549aaa7
SQL
SELECT SessionId, UserId, LastAccess
  FROM Sessions
 WHERE SessionId = @sid
 OPTION (RECOMPILE);
▶ 実行可

パターン3: RECOMPILE逆効果(高頻度+パラメータ依存なし)

SQL Server で OPTION(RECOMPILE) を脳死で付けて遅くなった話#e99b05b9a5e5
SQL
-- 0.5/1.5/2.5 を四捨五入。リテラル 0.5 は桁が足りず overflow するので CAST で桁を確保
SELECT ROUND(CAST(0.5 AS decimal(2,1)), 0)   -- 1.0
     , ROUND(CAST(1.5 AS decimal(2,1)), 0)   -- 2.0
     , ROUND(CAST(2.5 AS decimal(2,1)), 0);  -- 3.0
▶ 実行可

2. ROUND は四捨五入。銀行丸めじゃない(float はもっと危ない)

SQL Server の ROUND で金額計算がズレる3つの罠 — 丸め方向・負の桁・暗黙の切り捨て#69061412ae1f
SQL
-- float は 2.675 を正確に表現できないことがある
SELECT ROUND(CAST(2.675 AS float), 2);          -- 2.67(誤差で 2.675 が 2.6749… 扱い)
-- decimal なら正確
SELECT ROUND(CAST(2.675 AS decimal(10,3)), 2);  -- 2.680(正しく切り上げ)
▶ 実行可

2. ROUND は四捨五入。銀行丸めじゃない(float はもっと危ない)

SQL Server の ROUND で金額計算がズレる3つの罠 — 丸め方向・負の桁・暗黙の切り捨て#4e032d9da2e5
SQL
-- 金額は decimal で。消費税8%を計算
SELECT CAST(1000 AS decimal(12,2)) * 0.08;                         -- 80.0000
-- 表示桁を金額の2桁に揃えるなら、結果も明示的に丸める
SELECT CAST(CAST(1000 AS decimal(12,2)) * 0.08 AS decimal(12,2));  -- 80.00
▶ 実行可

3. INT同士の除算は、ROUNDより先に切り捨てられる

SQL Server の ROUND で金額計算がズレる3つの罠 — 丸め方向・負の桁・暗黙の切り捨て#a1a355ce9afe
SQL
-- NG: 同点の時に順位がブレる
SELECT customer_id, ROW_NUMBER() OVER (ORDER BY total_sales DESC) AS rn
FROM monthly_sales;

-- OK: customer_id を tiebreaker に
▶ 実行可

① ORDER BY なしで PARTITION BY だけ書く罠

SQL Server ROW_NUMBER の落とし穴 — Window Function の内部実装と Sort Operator の判断軸#898007531d46
SQL
-- 統計情報を見るためのセッション設定
SET STATISTICS IO ON;
SET STATISTICS TIME ON;

-- ROW_NUMBER + 大量データで Sort Operator を確認
▶ 実行可

Sort Operator がスピルしてる証拠の読み方 (実行計画 + sys.dm_exec_query_stats)

SQL Server ROW_NUMBER の落とし穴 — Window Function の内部実装と Sort Operator の判断軸#ba5a76787842
SQL
SELECT TOP 20
       qs.execution_count,
       qs.total_logical_reads / qs.execution_count AS avg_logical_reads,
       qs.total_elapsed_time / qs.execution_count / 1000 AS avg_elapsed_ms,
       SUBSTRING(qt.text, (qs.statement_start_offset / 2) + 1,
▶ 実行可

Sort Operator がスピルしてる証拠の読み方 (実行計画 + sys.dm_exec_query_stats)

SQL Server ROW_NUMBER の落とし穴 — Window Function の内部実装と Sort Operator の判断軸#791a21890408
SQL
SELECT
    OBJECT_NAME(s.object_id) AS table_name,
    s.name                   AS stats_name,
    STATS_DATE(s.object_id, s.stats_id) AS last_updated,
    s.auto_created,
▶ 実行可

① STATS_DATE() — 統計の最終更新日時

業務 SE が踏む統計情報乖離 — 本番とステで実行計画が割れる時に最初に見る 3 箇所#554096ea8bfc
SQL
SELECT
    OBJECT_NAME(si.id) AS table_name,
    si.name            AS index_name,
    si.rowcnt,
    si.rowmodctr,
▶ 実行可

② rowmodctr — 前回更新からの変更行数

業務 SE が踏む統計情報乖離 — 本番とステで実行計画が割れる時に最初に見る 3 箇所#c1fc85b69aff
SQL
SET STATISTICS PROFILE ON;
SELECT * FROM Orders WHERE Status = 'エラー' AND OrderDate > '2026-05-01';
SET STATISTICS PROFILE OFF;
▶ 実行可

③ 本番ステの実行計画 diff (EstimatedRows と ActualRows)

業務 SE が踏む統計情報乖離 — 本番とステで実行計画が割れる時に最初に見る 3 箇所#aa1f92dc4eec
SQL
-- 今この瞬間メモリ grant を持ってる / 待ってるクエリ
SELECT
    mg.session_id,
    mg.request_time,
    mg.grant_time,
▶ 実行可

罠①: メモリ grant 不足の検知 (DMV クエリ)

SQL Server tempdb スピルを業務 SE が本番で踏む 3 箇所 — 検知と回避の判断軸#f191b89fd23c
SQL
-- Resource Semaphore のキュー俯瞰
SELECT
    resource_semaphore_id,
    target_memory_kb     / 1024 AS target_mb,
    max_target_memory_kb / 1024 AS max_target_mb,
▶ 実行可

罠①: メモリ grant 不足の検知 (DMV クエリ)

SQL Server tempdb スピルを業務 SE が本番で踏む 3 箇所 — 検知と回避の判断軸#825167296635
SQL
-- 過去 grant が大きかった TOP 10 クエリ (2012 SP3 / 2014 SP2 / 2016+)
SELECT TOP 10
    qs.execution_count,
    qs.max_grant_kb     / 1024 AS max_grant_mb,
    qs.min_grant_kb     / 1024 AS min_grant_mb,
▶ 実行可

SQL Server 2012 SP3 以降なら dm_exec_query_stats も使える

SQL Server tempdb スピルを業務 SE が本番で踏む 3 箇所 — 検知と回避の判断軸#094982b96d49
SQL
-- tempdb のファイル構成と autogrowth 設定
SELECT
    name,
    physical_name,
    type_desc,
▶ 実行可

罠③: tempdb ファイル分割と autogrowth 設定の現状確認

SQL Server tempdb スピルを業務 SE が本番で踏む 3 箇所 — 検知と回避の判断軸#5e1f9e18ce2b