mcpField
S
sqlserver-expert

sqlserver-expert

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

sqlserver-expert について

Microsoft SQL Serverを扱う開発者やDBA向けのリファレンススキルです。高度なT-SQL、Node.jsからの接続、メタデータ照会、安全性と性能の実践方法を扱います。

主な機能

  1. 01CTEとウィンドウ関数の利用
  2. 02MERGEによるデータ変更
  3. 03mssqlを使ったNode.js接続
  4. 04テーブル・列・インデックス・キーの確認
  5. 05パラメーター化クエリと最小権限の適用
  6. 06クエリとインデックスの実践方法

活用シーン

  1. 01累計値を含む分析クエリの作成
  2. 02ソースとターゲットの行の同期
  3. 03データベーススキーマとインデックスの確認
  4. 04Node.jsでより安全なSQL Serverアクセスを構築

インストール

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

$npx skills add https://github.com/fabriciofs/mcp-postgres --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() でページネーションしてください。

コメント