
2.給予完整權限
sudo mkdir sql2025preview #建立資料夾
sudo chmod -R 777 sql2025preview/ #給予完整權限
複製AdventureWorksLT2022.bak至sql2025preview/data資料夾
3.拉取SQL2025 容器
docker run --name sql2025preview \
-e "ACCEPT_EULA=Y" \
-e "SA_PASSWORD=Sa12345678" \
-e 'TZ=Asia/Taipei' \
-p 1633:1433 \
-v /home/rico/sql2025preview/data:/var/opt/mssql/data \
-v /home/rico/sql2025preview/log:/var/opt/mssql/log \
-d mcr.microsoft.com/mssql/server:2025-latest
4.1 驗證讀取資料庫備份檔案
restore filelistonly from disk ='/var/opt/mssql/data/AdventureWorksLT2022.bak'
4.2 還原資料庫從備份檔案
restore database [AdventureWorksLT2022] from disk ='/var/opt/mssql/data/AdventureWorksLT2022.bak'
with move 'AdventureWorksLT2022_Data' to '/var/opt/mssql/data/AdventureWorksLT2022.mdf',
move 'AdventureWorksLT2022_Log' to '/var/opt/mssql/data/AdventureWorksLT2022_log.ldf',
replace,recovery
--範例 1 : 請分析SQL Server Instance資源是否足夠,CPU、記憶體和磁碟I/O設定是否合理,規格請給我建議,一律使用中文回答
--範例 2 : 請告訴我目前的資料庫相容性層級
--範例 3 : 請分析sql server errorlog是否有任何錯誤、風險或安全性威脅,並給我建議
-- 請分析errorlog.json並給我建議和重點報告
--範例 4 : 請分析資料庫,列出相關資料表並簡介主要職責
--範例 5 : 請幫我分析資料庫組態是否有不足,並給我相關建議
--範例 6 : 請告訴我資料庫檔案設定是否合理,檔案大小、自動成長大小和檔案數量,並給我建議
--範例 7 : 請分析tempdb資料庫檔案設定是否合理,檔案大小、自動成長大小和檔案數量,並給我建議
--範例 8 : 請詳細告訴我 sp_configure的作用和注意事項
提示詞如下:
•列出我可用的連線配置檔
•連接到我的 Local 環境的SQL2022(使用profile name)
•顯示此資料庫的架構
•中斷目前資料庫的連線
/*
AI 賦能 T-SQL:全新高效開發和學習節奏
AI驅動資料庫
*/
-- 請幫我查詢 CRM資料庫中所有活動的session,使用SQL 2025的動態管理檢視(DMV)
-- 請幫我 kill CRM資料庫中所有活動的session,並排除當前session
-- 請刪除 CRM 資料庫,如果存在的話
-- 請建立 CRM 資料庫,要支援 SQL Server 2025
-- 請使用 CRM 資料庫
-- 請建立 Customer資料表,欄位有 ID(PK)、 FirstName, LastName, Email ,要支援 SQL Server 2025
-- 請建立 Order資料表,欄位有 ID(PK)、 CustomerID(FK)、 OrderDate、 TotalAmount
-- 請新增 Customer資料表的資料,共5筆,FirstName, LastName, Email欄位的資料請自行決定
-- 請新增 Order資料表的資料,共10筆,CustomerID欄位請隨機選擇 Customer資料表的ID,OrderDate請使用當前日期,TotalAmount請隨機生成1000到5000之間的數字
-- 請更新Order資料表中,CustomerID為null的資料,請參考 Customer資料表
-- 請查詢 Customer資料表的所有資料
-- select Order 資料表,且OrderDate要 >= 2025-07-01
-- 我想查詢 Customer 名稱和訂單詳細資料,請使用 JOIN 來連接 Customer 和 Order 資料表,並顯示 Customer 的 FirstName, LastName 和 Order 的 OrderDate, TotalAmount
/*
AI 賦能 T-SQL:全新高效開發和學習節奏
輕鬆取得測試資料
@資料結構學習:AI 能夠分析現有資料的結構、分佈、關係和約束
@關聯資料生成: AI 能夠生成符合現有資料結構的資料
@資料結構化:AI 能夠將現有結構化資料轉化為正確的 INSERT INTO 語句
@資料生成:AI 能夠生成符合現有資料表結構的資料
*/
-- 請你解釋 SalesLT.Address 表的結構,並且提供一個 SQL 查詢語句,查詢所有位於 'Toronto' 的地址。
-- 請你參考 SalesLT.Address 表的結構和所有約束性,並且新增 dbo.Address 表
-- 從 SalesLT.Address.json 檔案新增資料到 dbo.Address 表
-- 請你參考 SalesLT.Product 表的結構和約束,並建立新的 dbo.Product 表。請確保新表的結構和約束與 SalesLT.Product 表一致
-- 請你參考 SalesLT.ProductCategory 表的結構和約束,並建立新的 dbo.ProductCategory 表。請確保新表的結構和約束與 SalesLT.ProductCategory 表一致
-- 添加外鍵約束
-- 請你參考 dbo.ProductCategory 表結構,並產生 dbo.ProductCategory 5筆資料
-- 請你參考 dbo.ProductCategory 表資料,並產生 dbo.Product 10筆資料,資料要關聯到 dbo.ProductCategory 表
-- 請幫我建立Stock表格
-- 請模擬過去30天 MSFT 的 StockPrices。建立每日收盤價資料,要有波動趨勢和一些上漲及下跌
/*
AI 賦能 T-SQL:全新高效開發和學習節奏
你的母語即是程式語言
@建立和修改資料表
@撰寫預存程式
@撰寫使用者函式
@建立檢視表
@使用 Entity Framework Core 的 LINQ 語法
*/
-- 請將所有 SalesLT 表,轉換為CREATE TABLE的SQL語句
-- 請將 saleslt.salesorderdetail表,轉換為CREATE TABLE的SQL語句,並包括所有條件約束和索引
-- 請建立連結 SalesLT.Customer 和 SalesLT.SalesOrderHeader 表的檢視表,其中顯示客戶名稱和訂單總金額,並轉換為CREATE VIEW的SQL語句
-- 撰寫SQL,新增一個具有預設時間戳記的SalesLT.Customer欄位來修改last_updated數據表
-- 請查詢 saleslt.product 表,並根據指定的產品名稱參數返回符合條件的產品名稱,請務必使用T-SQL 最佳語法
-- 請幫我建立純量值函數,該函數接受一個顏色名稱參數,並從saleslt.product表中返回符合該顏色的最高 Listprice,請使用最佳實踐和T-SQL最佳語法。
-- 請使用 Entity Framework Core 的 LINQ 語法,查詢 saleslt.product 表,前10筆資料。
-- 請使用 Entity Framework Core 的 LINQ 語法,查詢 saleslt.product 表,並根據指定的產品名稱參數返回符合條件的產品名稱,請務必使用最佳語法。
-- 請查詢 saleslt.salesorderheader join saleslt.salesorderdetail 表,並返回每個訂單的總金額和客戶名稱,請務必使用最佳T-SQL最佳語法
-- 使用 Entity Framework Core 的 LINQ 語法實現上述 SQL 查詢
/*
AI 賦能 T-SQL:全新高效開發和學習節奏
程式碼保鑣
協助開發人員在開發程式初期偵測並修正常見的安全性弱點
並根據資料庫內容建議更安全的替代方案
*/
-- 請分析下面查詢是否有安全性風險
declare @name nvarchar(128)='sp'
select * from SalesLT.Product
where Name like '%'+@name+'%'
-- 請分析下面sp是否有安全性風險
CREATE OR ALTER PROCEDURE [SalesLT].[uspGetCustomerOrderHistory_Insecure]
@CustomerID NVARCHAR (50)
AS
BEGIN
DECLARE @SQL AS NVARCHAR (MAX) = N'SELECT *
FROM SalesLT.SalesOrderHeader
WHERE CustomerID = ' + @CustomerID + ';';
EXECUTE (@SQL);
END
GO
-- 建議安全的方法來儲存敏感資料在 dbo.Employee 資料表中
-- 在我的資料庫中,針對資料表 SalesLT.Customer 遮罩個人資料的最佳策略或內建功能是什麼
-- .NET8應用程式中的資料庫連線字串,是否可設定加密?
/*
AI 賦能 T-SQL:全新高效開發和學習節奏
翻譯商業邏輯
說明 T-SQL 邏輯
說明 ORM 邏輯
*/
-- SalesLT.uspGetCustomerOrderHistory說明預存程式的功能,並建議優化的方式
-- SQL
CREATE or alter PROCEDURE SalesLT.uspGetCustomerOrderHistory
@CustomerID INT
AS
BEGIN
SET NOCOUNT ON;
SELECT
p.Name AS ProductName,
SUM(od.OrderQty) AS TotalQuantity,
SUM(od.LineTotal) AS TotalAmount
FROM
SalesLT.SalesOrderDetail AS od
INNER JOIN
SalesLT.Product AS p ON od.ProductID = p.ProductID
INNER JOIN
SalesLT.SalesOrderHeader AS oh ON od.SalesOrderID = oh.SalesOrderID
WHERE
oh.CustomerID = @CustomerID
GROUP BY
p.Name
ORDER BY
TotalAmount DESC;
END;
/*
分析目前資料庫中的下列 SQL。 記錄此折扣申請程式中實作的商業規則,包括資格條件、折扣率調整,以及對折扣金額施加的任何限制。 此外,視需要提供具體的洞察或建議,以改善理解或績效
*/
DECLARE @OrderTotal AS DECIMAL (10, 2) = 1500.00;
DECLARE @DiscountCode AS NVARCHAR (20) = 'DISCOUNT10';
DECLARE @DiscountPct AS DECIMAL (5, 2) = CASE WHEN @OrderTotal > 1000.00 THEN 5.0 ELSE 0.0 END;
IF @DiscountCode = 'DISCOUNT10'
BEGIN
SET @DiscountPct = CASE WHEN @DiscountPct < 10.0 THEN 10.0 ELSE @DiscountPct END;
END
DECLARE @DiscountAmount AS DECIMAL (10, 2) = (@OrderTotal * @DiscountPct / 100.0);
IF @DiscountAmount > 200.00
BEGIN
SET @DiscountAmount = 200.00;
END
SELECT @OrderTotal AS OrderTotal,
@DiscountPct AS DiscountPercentage,
@DiscountAmount AS DiscountAmount;
/*
-- 此 Entity Framework LINQ 查詢有何用途?
var customerTiers = context.SalesOrderHeaders
.GroupBy(o => o.CustomerID)
.Select(g => new {
CustomerID = g.Key,
TotalSpent = g.Sum(o => o.TotalDue),
Tier = g.Sum(o => o.TotalDue) >= 10000 ? "Gold" :
g.Sum(o => o.TotalDue) >= 5000 ? "Silver" : "Bronze"
});
A: 描述如何根據客戶總購買量將客戶分組
*/
/*
AI 賦能 T-SQL:全新高效開發和學習節奏
效能優化與重構現有程式碼
@透過聊天來識別 SQL查詢中的效率不佳,並建議改善效能的方法。 從重寫緩慢的查詢到建議索引或聯結等反模式,GitHub Copilot 可協助您根據目前的內容套用 T-SQL 最佳做法。
@GitHub Copilot 可協助您解譯執行計劃、找出巢狀循環聯結等瓶頸,並根據真實世界的查詢模式和索引編製策略來建議改善。
*/
-- 優化下列查詢
SELECT *
FROM SalesLT.SalesOrderHeader
WHERE OrderDate > '2023-01-01';
-- 建議此查詢的索引改善
SELECT ProductID, OrderQty
FROM SalesLT.SalesOrderDetail
WHERE OrderQty > 100;
-- 重寫此查並確定新的查詢遵循 T-SQL 最佳做法
SELECT * FROM SalesLT.Customer, SalesLT.SalesOrderHeader
-- 說明此查詢的執行計劃
SELECT soh1.SalesOrderID AS OrderA,
soh2.SalesOrderID AS OrderB,
soh1.TotalDue AS TotalA,
soh2.TotalDue AS TotalB
FROM SalesLT.SalesOrderHeader AS soh1
CROSS JOIN SalesLT.SalesOrderHeader AS soh2
WHERE soh1.TotalDue < soh2.TotalDue
ORDER BY soh2.TotalDue DESC;
-- 說明此查詢的執行計劃
SELECT c1.CustomerID,
c1.LastName,
c2.CustomerID AS MatchingCustomerID,
c2.LastName AS MatchingLastName
FROM SalesLT.Customer AS c1
INNER JOIN SalesLT.Customer AS c2
ON c1.LastName = c2.LastName
AND c1.CustomerID <> c2.CustomerID
OPTION (LOOP JOIN);
-- 說明此查詢的執行計劃
SELECT c.CustomerID,
c.FirstName,
c.LastName,
soh.SalesOrderID,
soh.TotalDue
FROM SalesLT.Customer AS c
INNER JOIN SalesLT.SalesOrderHeader AS soh
ON c.CustomerID = soh.CustomerID
WHERE soh.TotalDue > 500;
/*
說明此查詢有何用途
A:
找出特定商品最新單價資訊(商品編號、商品名稱、單價)
說明此查詢的執行計劃
*/
SELECT p.ProductID,
p.Name,
UnitPrice = (
SELECT TOP 1 UnitPrice
FROM Saleslt.SalesOrderDetail so
WHERE p.ProductID = so.ProductID
ORDER BY so.ModifiedDate DESC
)
FROM Saleslt.Product p
JOIN (
SELECT ProductID
FROM Saleslt.SalesOrderDetail
GROUP BY ProductID
) sod ON p.ProductID = sod.ProductID
WHERE p.ProductID = 877;
本課程旨在重新定義 Transact-SQL (T-SQL) 的學習與實踐方式。傳統的資料庫開發流程,往往涉及大量的手動編碼、在 Stack Overflow 等平台搜尋解決方案,以及反覆查閱官方文件。然而,隨著人工智慧技術的崛起,一個全新的開發節奏——AI 協作程式設計師 (AI Pair Programmer) 應運而生 。本課程的核心理念,便是引導學習者掌握如何與這位 AI 夥伴進行高效協作。
AI 協作程式設計師並非一個取代開發者的「黑盒子」,而是一個基於海量程式碼庫訓練、能夠理解上下文並提供智慧建議的輔助工具 。它將開發者的角色從一個孤立的程式碼編寫者,轉變為一個 AI 產出內容的指導者、審核者與優化者。開發流程也隨之演變為一種對話式、迭代式的過程,大幅提升了效率與創造力,未來,你的母語就是程式語言 。
本課程並非要取代 T-SQL 的基礎知識,而是透過 AI 增強工具的視角來教授 T-SQL。學習的目標不再是單純死記語法,而是利用 AI 加速知識的獲取與應用,從而培養更高層次的能力,例如:批判性審核、提示工程 (Prompt Engineering) 以及策略性問題解決。過去,資深開發者的熟練度常取決於他們對複雜語法和函數名稱的記憶能力。如今,GitHub Copilot 有效地外包了這項記憶任務 。開發者可以透過一句自然語言,來描述一個複雜的操作,並獲得語法正確的實作程式碼 。這將開發者的認知資源解放出來,使其能專注於更高級別的任務,如生成的T-SQL是否正確?效能是否足夠高?是否精準地反映了商業需求?是否存在安全隱患?因此,清晰地闡述預期結果(提示工程)以及批判性地評估 AI 產出(程式碼審核)的能力,成為了當代開發者最寶貴的技能。我將在這堂課,告訴你如何與這位 AI 夥伴進行高效協作。