在 SQL Server Management Studio 中使用 Copilot

已完成

SQL Server Management Studio (SSMS) 支持两个 AI 支持的编码助手,可帮助你编写、优化 和排查 T-SQL 代码问题。 GitHub Copilot 提供跨多种语言的常规编码帮助,而 Copilot 提供特定于连接的 SQL Server 实例的数据库感知建议。

这两种工具都使用大型语言模型来加速数据库开发。 GitHub Copilot 在整个代码库中的代码补全和模式识别方面表现出色,它利用数据库架构、索引及统计信息,提供上下文敏感的 T-SQL 帮助。

这些 AI 助手使数据库开发更易于访问,并提高新开发人员和经验丰富的开发人员的工作效率。 无论是编写查询、调试代码还是优化性能,AI 提供支持的帮助都有助于专注于解决业务问题,而不是记住语法。

在 SSMS 中使用 GitHub Copilot

SSMS 中的 GitHub Copilot 为数据库开发工作流带来了 AI 提供支持的代码完成和生成。 作为一个通用编码助手,GitHub Copilot 通过在你键入时建议代码,并根据自然语言注释生成完整查询,帮助你更快地编写 T-SQL。

了解 GitHub Copilot 功能

GitHub Copilot 为 SQL Server 开发提供了多项功能:

  • 内联代码完成功能: 编写 T-SQL 代码时提供实时建议
  • 自然语言转代码: 编写描述意图的注释,生成有效查询
  • 多行建议: 生成整个查询块、过程或函数
  • 模式识别: 了解工作区中的编码样式和常见模式
  • 上下文感知:会考虑你已在当前文件中编写的代码
  • 多语言支持: 与数据库项目中使用的 T-SQL、PowerShell、Python 和其他语言配合使用

GitHub Copilot 分析当前文件、打开的标签页和工作区,以便提供相关建议。 虽然它不直接连接到数据库,但它可识别 T-SQL 语法模式和常见的数据库开发做法。

在 SSMS 中启用 GitHub Copilot

若要在 SQL Server Management Studio 中使用 GitHub Copilot,请执行以下作:

  1. 确保已安装 SSMS 19.3 或更高版本
  2. 从“扩展”菜单安装 GitHub Copilot 扩展
  3. 使用您的具有活动 GitHub Copilot 订阅 的 GitHub 帐户登录
  4. 工具>选项 > GitHub Copilot 中配置首选项

注释

GitHub Copilot 需要付费订阅(个人、企业或企业版)。 某些组织为开发人员提供 GitHub Copilot 作为开发工具许可证的一部分。

使用内联建议编写代码

键入时,GitHub Copilot 会提供建议:

-- Start typing a query
SELECT c.CustomerName, 
-- 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

-- 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;

灰色虚影文本显示科皮洛特的建议。 按 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

-- 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 随时间推移适应你的风格。 如果一直使用特定的命名约定、格式或模式,Copilot 会将它们合并到建议中:

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

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

这种个性化使建议更自然,并减少手动格式设置的需求。

应用 GitHub Copilot 最佳做法

最大化 GitHub Copilot 的有效性:

练习 Description
编写描述性注释 明确、具体的注释可生成更好的代码建议
使用有意义的名称 描述性表和列名称可帮助 Copilot 了解上下文
分解复杂任务 为复杂的过程编写多个注释,而不是编写一个大的整体注释块
查看所有建议 始终验证生成的代码以保持正确性和安全性
提供示例 在注释中包含示例数据或预期输出
保持上下文的邻近 打开相关文件或架构,为 Copilot 提供更多上下文
对建议进行迭代 如果第一个建议不太正确,请尝试重新描述你的评论

在 SSMS 中使用 Copilot

SSMS 中的 Copilot 提供对数据库有认知的 AI 辅助,可直接连接到 SQL Server 实例。 与 GitHub Copilot 不同,Copilot 可以访问数据库架构、索引、统计信息和元数据,从而实现更上下文准确的 T-SQL 建议。

GitHub Copilot 在 SQL Server Management Studio 中进行 AI 支持的代码完成功能的屏幕截图。

了解 Copilot 功能

Copilot 提供特定于数据库的功能:

  • 模式感知建议: 熟知您表结构、列以及数据类型的细节
  • 查询优化: 分析执行计划并建议性能改进
  • 自然语言查询: 根据实际数据库将问题转换为 T-SQL
  • 解释查询: 用简单语言描述现有查询执行的作用。
  • 修复错误: 在查询失败时提供上下文感知建议
  • 索引建议: 根据数据库统计信息建议索引

由于 Copilot 连接到数据库,因此它会生成用于特定架构的代码,而无需修改。

使用自然语言进行查询

使用纯英语询问有关数据的问题:

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

-- 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;

Copilot 知道确切的表和列名称,确保查询能立刻生效。

优化查询性能

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;

-- 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);

了解和修复错误

查询失败时,Copilot 会解释问题并提供修复:

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

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

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

-- 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;

选择正确的工具

这两种工具都为 SQL Server 开发提供价值:

功能 / 特点 GitHub Copilot Copilot
数据库架构感知 是的
多语言支持 是的 T-SQL 焦点
查询优化 基于模式 特定于数据库
在 SSMS 之外工作 是的
需要数据库连接 是的
Subscription GitHub Copilot Copilot

使用 GitHub Copilot 来进行常规的 T-SQL 开发、多语言项目开发,以及整个代码库中的代码完成。 将 Copilot 用于特定于数据库的任务,其中架构感知、查询优化和直接数据库交互可提供更好的结果。

许多开发人员同时使用两者:GitHub Copilot 进行日常编码,在处理特定数据库实例时使用 Copilot。 这些 AI 助手共同加速数据库开发,同时维护代码质量和安全标准。