SQL Server Management Studio で GitHub Copilot を使用する

完了

SQL Server Management Studio (SSMS) には、T-SQL コードの記述、最適化、トラブルシューティングに役立つ AI を利用したアシスタントである GitHub Copilot が含まれています。 GitHub Copilot では、T-SQL を記述するときにクエリ エディターでコード補完が提供されます。また、自然言語を使用してクエリの作成に役立つチャットを提供したり、データベースや環境に関する質問をしたり、SQL の問題に関するヘルプを表示したりできます。 常に最新リリースの SSMS (現在の SSMS 22) を GA リリースとして使用する必要があります。

GitHub Copilot ではモデルを選択でき、利用可能なモデルはサブスクリプションによって異なります。 GitHub Copilot はコード補完を提供し、接続とデータベース スキーマを活用してモデルにコンテキストを提供し、応答を改善します。

GitHub Copilot は、データベース開発のアクセシビリティを高め、新しい開発者と経験豊富な開発者の両方の生産性を向上させます。 GitHub Copilot は、クエリの記述、コードに関する問題のトラブルシューティング、パフォーマンスの最適化のいずれであっても、構文を覚えるのではなく、ビジネス上の問題の解決に集中するのに役立ちます。

SQL Server Management Studio の GitHub Copilot について

SSMS の GitHub Copilot は、AI を利用したコード補完、生成、チャットをデータベース開発ワークフローに提供します。 GitHub Copilot は、入力時にコードを提案し、自然言語のコメントからクエリ全体を生成し、データベースに関する質問や SQL の問題に関するヘルプを得ることができるチャット エクスペリエンスを提供することで、T-SQL の記述をより迅速に行うのに役立ちます。

GitHub Copilot の機能を確認する

GitHub Copilot には、SQL Server 開発用のいくつかの機能が用意されています。

  • インライン コード補完: T-SQL コードを記述する際のリアルタイムの提案
  • 自然言語からコードへ: 意図を説明するコメントを書き込み、作業クエリを取得する
  • 複数行の提案: クエリ ブロック、プロシージャ、または関数全体を生成する
  • コンテキスト対応: 接続先のデータベースのスキーマを理解します

GitHub Copilot では、チャットを介して次の機能も提供しています。

  • スキーマ対応の推奨事項: 正確なテーブル構造、列、およびデータ型を認識します
  • クエリの最適化: クエリを分析し、パフォーマンスの向上を提案します
  • 自然言語クエリ: 接続しているデータベースに基づいて、質問を T-SQL に変換します。
  • クエリについて説明します。 既存のクエリがプレーン言語で実行する内容について説明します
  • エラーを修正します。 クエリが失敗したときにコンテキストに対応した提案を提供します
  • インデックスの推奨事項: DMV またはクエリ プランで不足しているインデックス候補に基づいてインデックスを提案する

GitHub Copilot では、クエリとデータベースのパフォーマンスのトラブルシューティングに加え、データベースのメンテナンス、ベスト プラクティス、データベースとサーバーの構成などの質問に答えるサポートも提供されています。

SSMS で GitHub Copilot を有効にする

SQL Server Management Studio で GitHub Copilot を使用するには:

  1. SSMS 22 がインストールされていることを確認する
  2. Visual Studio インストーラーAI Assistance ワークロードを選択して GitHub Copilot をインストールする
  3. アクティブな GitHub Copilot サブスクリプションを持つ GitHub アカウントでサインインします
  4. Tools > Options > GitHub > CopilotTools > Options > Text Editor > Inline Suggestions で設定を構成する

GitHub Copilot にはサブスクリプション (個人、ビジネス、エンタープライズ) が必要です。 一部の組織では、開発ツールライセンスの一部として開発者に GitHub Copilot を提供しています。 GitHub Copilot サブスクリプションは、Visual Studio と VS Code でも使用できます。

インライン候補を含むコードを記述する

GitHub Copilot では、入力時に次の候補が提供されます。

-- Start typing a query
SELECT c.CustomerName, 
-- GitHub Copilot suggests: c.Email, c.Phone, c.City
-- Press Tab to accept

-- Or write a comment describing what you need:
-- Get total sales by product category for last quarter

-- GitHub Copilot generates:
SELECT 
    p.Category,
    SUM(od.Quantity * od.UnitPrice) AS TotalSales
FROM Products p
INNER JOIN OrderDetails od ON p.ProductID = od.ProductID
INNER JOIN Orders o ON od.OrderID = o.OrderID
WHERE o.OrderDate >= DATEADD(QUARTER, -1, GETDATE())
GROUP BY p.Category
ORDER BY TotalSales DESC;

灰色のゴースト テキストは、GitHub Copilot の提案を示しています。 Tab キーを押して承諾するか、Esc キーを押して閉じます。

ストアド プロシージャと関数を生成する

コメント内の複雑なデータベース オブジェクトについて説明します。

-- Create a stored procedure to calculate customer lifetime value
-- Parameters: @CustomerID int
-- Returns: @TotalValue money, @OrderCount int, @FirstOrderDate date, @LastOrderDate date

-- GitHub Copilot generates:
CREATE PROCEDURE sp_GetCustomerLifetimeValue
    @CustomerID INT
AS
BEGIN
    SELECT 
        @CustomerID AS CustomerID,
        SUM(od.Quantity * od.UnitPrice) AS TotalValue,
        COUNT(DISTINCT o.OrderID) AS OrderCount,
        MIN(o.OrderDate) AS FirstOrderDate,
        MAX(o.OrderDate) AS LastOrderDate
    FROM Orders o
    INNER JOIN OrderDetails od ON o.OrderID = od.OrderID
    WHERE o.CustomerID = @CustomerID
    GROUP BY o.CustomerID;
END;

GitHub Copilot は手続き型パターンを理解し、完全な実行可能コードを生成します。

データベース スキーマを調べる

GitHub Copilot は、データベース構造を探索するためのクエリを記述するのに役立ちます。

-- Show all foreign key relationships for Orders table

-- GitHub Copilot suggests:
SELECT 
    fk.name AS ForeignKeyName,
    OBJECT_NAME(fk.parent_object_id) AS TableName,
    COL_NAME(fkc.parent_object_id, fkc.parent_column_id) AS ColumnName,
    OBJECT_NAME(fk.referenced_object_id) AS ReferencedTable,
    COL_NAME(fkc.referenced_object_id, fkc.referenced_column_id) AS ReferencedColumn
FROM sys.foreign_keys fk
INNER JOIN sys.foreign_key_columns fkc ON fk.object_id = fkc.constraint_object_id
WHERE OBJECT_NAME(fk.parent_object_id) = 'Orders'
   OR OBJECT_NAME(fk.referenced_object_id) = 'Orders';

現在のエディターのコーディング パターンを適用する

GitHub Copilot は、現在のエディターのコーディング パターンに従います。 特定の名前付け規則、書式設定、またはパターンを使用する場合、GitHub Copilot はそれらを提案に組み込みます。

-- If you typically write your queries like this:
SELECT 
    c.CustomerID
    ,c.CustomerName
    ,c.Email
FROM Customers AS c
WHERE c.IsActive = 1;

-- GitHub Copilot follows your style and suggests:
SELECT 
    o.OrderID
    ,o.OrderDate
    ,o.TotalAmount
FROM Orders AS o
WHERE o.Status = 'Completed';

この一貫性により、提案はより自然に感じられ、手動で書式設定する必要が減ります。

GitHub Copilot のベスト プラクティスを適用する

GitHub Copilot の有効性を最大化する:

練習 Description
説明的なコメントを書く 明確で具体的なコメントを使用すると、より優れたコード候補が生成されます
わかりやすい名前を使用する 説明的なテーブルと列名は、GitHub Copilot がコンテキストを理解するのに役立ちます
複雑なタスクを分割する 1 つの大きなブロックではなく、複雑なプロシージャに対して複数のコメントを記述する
すべての提案を確認する 生成されたコードの正確性とセキュリティを常に検証する
例を提供する サンプル データまたは予想される出力をコメントに含める
提案を反復処理する 最初の提案が正しくない場合は、コメントの言い換えをお試しください

自然言語を使用したクエリ

プレーンな英語を使用して、データに関する質問をします。

-- Ask GitHub Copilot: "Show customers who placed more than 5 orders last month"

-- GitHub Copilot generates (using your actual schema):
SELECT 
    c.CustomerID,
    c.CustomerName,
    c.Email,
    COUNT(o.OrderID) AS OrderCount
FROM Customers c
INNER JOIN Orders o ON c.CustomerID = o.CustomerID
WHERE o.OrderDate >= DATEADD(MONTH, -1, GETDATE())
    AND o.OrderDate < DATEADD(DAY, 1, EOMONTH(DATEADD(MONTH, -1, GETDATE())))
GROUP BY c.CustomerID, c.CustomerName, c.Email
HAVING COUNT(o.OrderID) > 5
ORDER BY OrderCount DESC;

GitHub Copilot はデータベースに接続するため、特定のスキーマで動作するコードが生成されます。

クエリのパフォーマンスを最適化する

GitHub Copilot はクエリを分析し、改善を提案します。

-- Select a slow query and ask: "How can I make this faster?"

-- Original query:
SELECT c.CustomerName, SUM(od.Quantity * od.UnitPrice) AS Total
FROM Customers c
LEFT JOIN Orders o ON c.CustomerID = o.CustomerID
LEFT JOIN OrderDetails od ON o.OrderID = od.OrderID
WHERE o.OrderDate >= '2024-01-01'
GROUP BY c.CustomerName;

-- GitHub Copilot suggests:
-- 1. Change LEFT JOIN to INNER JOIN (WHERE filters out NULLs anyway)
-- 2. Add covering index: CREATE INDEX IX_Orders_Date ON Orders(OrderDate, CustomerID, OrderID)
-- 3. Consider indexed view for frequent aggregations

-- Optimized query:
SELECT c.CustomerName, SUM(od.Quantity * od.UnitPrice) AS Total
FROM Customers c
INNER JOIN Orders o ON c.CustomerID = o.CustomerID
INNER JOIN OrderDetails od ON o.OrderID = od.OrderID
WHERE o.OrderDate >= '2024-01-01'
GROUP BY c.CustomerName
OPTION (RECOMPILE);

エラーの理解と修正

クエリが失敗すると、GitHub Copilot によって問題が説明され、修正が提供されます。

-- Query with error:
SELECT CustomerName, SUM(TotalAmount)
FROM Orders;

-- Error: Column 'Orders.CustomerName' is invalid in the select list

-- Ask GitHub Copilot: "What's wrong with this query?"

-- GitHub Copilot explains and fixes:
/*
The error occurs because CustomerName is not in an aggregate function or GROUP BY clause.
When using aggregate functions like SUM(), all non-aggregated columns must be grouped.
*/

-- Corrected query:
SELECT CustomerName, SUM(TotalAmount) AS Total
FROM Orders
GROUP BY CustomerName;

GitHub Copilot を最大限に活用する

GitHub Copilot チャット ウィンドウはデータベース接続なしで機能しますが、クエリ エディターを開いてデータベースに接続している場合は、はるかに価値があります。 GitHub Copilot を使用して、一般的な T-SQL 開発、エディターでのコード補完、データベースとサーバーの理解、クエリの最適化などを行います。

開発者は、日々のコーディングに GitHub Copilot を使用し、特定のデータベースの質問に答えることができます。これにより、コードの品質を維持し、ベスト プラクティスを活用しながらデータベース開発を高速化できます。