應用層需獲取剛插入行的自增 ID,常見錯誤模式導致額外往返或記錄集混淆。
-- 單批次執行,SET NOCOUNT ON 抑制 DONE_IN_PROC
SET NOCOUNT ON;
INSERT INTO Products (ProductName) VALUES ('Chalk');
SELECT SCOPE_IDENTITY() AS NewID; -- 推薦:僅返回當前作用域標識
using (var cmd = conn.CreateCommand()) {
cmd.CommandText = "SET NOCOUNT ON; INSERT INTO Products (ProductName) VALUES (@n); SELECT SCOPE_IDENTITY();";
cmd.Parameters.AddWithValue("@n", "Chalk");
var newId = Convert.ToInt32(cmd.ExecuteScalar()); // 直接獲取標量
}
CREATE TRIGGER tr_Products_Ins ON Products FOR INSERT AS
SELECT SCOPE_IDENTITY() AS NewID;
任何 INSERT 自動返回 ID,應用層無感知。注意:觸發器增加微小開銷,批量插入時每行觸發。
CREATE TABLE #Top5Orders (OrderID INT, OrderDate DATETIME);
INSERT INTO #Top5Orders SELECT TOP 5 OrderID, OrderDate FROM Orders ORDER BY OrderDate DESC;
SELECT p.ProductName, SUM(od.Quantity) AS Qty
FROM #Top5Orders t
JOIN [Order Details] od ON t.OrderID = od.OrderID
JOIN Products p ON od.ProductID = p.ProductID
GROUP BY p.ProductName;
DROP TABLE #Top5Orders;
WITH Top5Orders AS (
SELECT TOP 5 OrderID, OrderDate FROM Orders ORDER BY OrderDate DESC
)
SELECT p.ProductName, SUM(od.Quantity) AS Qty
FROM Top5Orders t
JOIN [Order Details] od ON t.OrderID = od.OrderID
JOIN Products p ON od.ProductID = p.ProductID
GROUP BY p.ProductName;
見 20340 詳細展開。核心:INCLUDE 覆蓋高頻 SELECT 列,讓查詢完全在索引內完成。
ALTER DATABASE ... SET PARAMETERIZATION FORCED(謹慎,需測試)。sp_executesql / ORM 參數化,避免臨時 SQL 產生大量單用計劃。OPTION (OPTIMIZE FOR @param = 'typical_value') 解決參數嗅探問題。| 策略 | 適用場景 | 命令 |
|---|---|---|
| 自動更新 (默認) | 中小表、均勻分布 | AUTO_UPDATE_STATISTICS ON |
| 異步更新 | 高併發、拒絕等待統計更新 | AUTO_UPDATE_STATISTICS_ASYNC ON |
| 全掃描手動更新 | 大表、斜度數據、關鍵查詢 | UPDATE STATISTICS tbl WITH FULLSCAN |
| 增量統計 (2014+) | 分區表、僅更新活躍分區 | UPDATE STATISTICS tbl WITH INCREMENTAL = ON |
| 定時作業 | 低峰期全量維護 | Agent Job + sp_updatestats / 自定義腳本 |