mcpField
S
sqlserver-expert

sqlserver-expert

github.com/fabriciofsデータ・データベース1212 回インストール13 週間前に更新
リポジトリ

sqlserver-expert について

SQL Server の DBA と開発者向けの技術スキルです。高度な T-SQL、Node.js 連携、データベース調査用クエリ、安全性とパフォーマンスの実践方法を扱います。

主な機能

  1. 01CTE とウィンドウ関数の作成
  2. 02MERGE 文の利用
  3. 03mssql による Node.js 連携
  4. 04テーブル、インデックス、外部キーの調査
  5. 05セキュリティと性能の実践

活用シーン

  1. 01クエリで累積値を計算
  2. 02パラメーター化クエリで DB に接続
  3. 03テーブルやインデックス、外部キーの確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/fabriciofs/mcp-sql-server --skill sqlserver-expert

インストール後、Claude Code で/sqlserver-expertを入力して読み込まれたか確認します。

詳細

SQL Server のエキスパート

Microsoft SQL Server に精通した DBA 兼開発者です。

T-SQL の高度な機能

CTE(共通テーブル式)
WITH RankedUsers AS (
  SELECT
    Id, Name, Email,
    ROW_NUMBER() OVER (PARTITION BY Department ORDER BY HireDate) AS RowNum
  FROM Users
)
SELECT * FROM RankedUsers WHERE RowNum = 1;
ウィンドウ関数
SELECT
  OrderId,
  OrderDate,
  Amount,
  SUM(Amount) OVER (ORDER BY OrderDate) AS RunningTotal,
  LAG(Amount) OVER (ORDER BY OrderDate) AS PreviousAmount,
  AVG(Amount) OVER (PARTITION BY CustomerId) AS CustomerAvg
FROM Orders;
MERGE ステートメント
MERGE INTO TargetTable AS target
USING SourceTable AS source
ON target.Id = source.Id
WHEN MATCHED THEN
  UPDATE SET target.Name = source.Name
WHEN NOT MATCHED THEN
  INSERT (Id, Name) VALUES (source.Id, source.Name)
WHEN NOT MATCHED BY SOURCE THEN
  DELETE;

Node.js との統合(mssql)

コネクションプール
import sql from "mssql";

const config: sql.config = {
  user: process.env.SQL_USER,
  password: process.env.SQL_PASSWORD,
  server: process.env.SQL_SERVER || "localhost",
  database: process.env.SQL_DATABASE,
  options: {
    encrypt: true,
    trustServerCertificate: true,
    enableArithAbort: true,
  },
  pool: {
    min: 2,
    max: 10,
    idleTimeoutMillis: 30000,
  },
};

let pool: sql.ConnectionPool | null = null;

export async function getPool(): Promise<sql.ConnectionPool> {
  if (!pool) {
    pool = await sql.connect(config);
  }
  return pool;
}
パラメーター化クエリ
const pool = await getPool();
const request = pool.request();

request.input("userId", sql.Int, userId);
request.input("status", sql.VarChar(50), status);

const result = await request.query(`
  SELECT * FROM Users
  WHERE Id = @userId AND Status = @status
`);

便利なクエリ

テーブルの一覧表示
SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE
FROM INFORMATION_SCHEMA.TABLES
ORDER BY TABLE_SCHEMA, TABLE_NAME;
テーブル構造
SELECT
  c.COLUMN_NAME,
  c.DATA_TYPE,
  c.CHARACTER_MAXIMUM_LENGTH,
  c.IS_NULLABLE,
  c.COLUMN_DEFAULT
FROM INFORMATION_SCHEMA.COLUMNS c
WHERE c.TABLE_SCHEMA = @schema AND c.TABLE_NAME = @table
ORDER BY c.ORDINAL_POSITION;
インデックス
SELECT
  i.name AS IndexName,
  i.type_desc AS IndexType,
  i.is_unique,
  i.is_primary_key,
  STRING_AGG(c.name, ', ') AS Columns
FROM sys.indexes i
JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id
JOIN sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id
WHERE i.object_id = OBJECT_ID(@tableName)
GROUP BY i.name, i.type_desc, i.is_unique, i.is_primary_key;
外部キー
SELECT
  fk.name AS FK_Name,
  tp.name AS ParentTable,
  cp.name AS ParentColumn,
  tr.name AS ReferencedTable,
  cr.name AS ReferencedColumn
FROM sys.foreign_keys fk
JOIN sys.foreign_key_columns fkc ON fk.object_id = fkc.constraint_object_id
JOIN sys.tables tp ON fkc.parent_object_id = tp.object_id
JOIN sys.columns cp ON fkc.parent_object_id = cp.object_id AND fkc.parent_column_id = cp.column_id
JOIN sys.tables tr ON fkc.referenced_object_id = tr.object_id
JOIN sys.columns cr ON fkc.referenced_object_id = cr.object_id AND fkc.referenced_column_id = cr.column_id
WHERE tp.name = @tableName;

ベストプラクティス

セキュリティ
  1. クエリで文字列を決して連結しないでください。パラメーターを使用してください。
  2. アプリケーションユーザーには最小限の権限を付与してください。
  3. アクセスを整理および制御するためにスキーマを使用してください。
パフォーマンス
  1. SELECT * は避け、列を明示的に列挙してください。
  2. WHERE 句と JOIN に適切なインデックスを使用してください。
  3. WHERE 句で列に関数を適用するのは避けてください(SARGable ではありません)。
  4. ストアドプロシージャでは SET NOCOUNT ON を使用してください。
  5. OFFSET/FETCH または ROW_NUMBER() でページネーションしてください。

コメント