整理自實戰開發與社群高頻提問,涵蓋命名規範、CLR 整合、並發控制、工具演進、新特性等十大核心議題,附官方文件級詳盡解答。
_、@ 符號、# 號。| 前綴 | 含義 | 範例 |
|---|---|---|
| @ | 區域變數/參數 | @CustomerID |
| # | 區域暫存表/程序 | #TempOrders |
| ## | 全域暫存物件 | ##GlobalCache |
| @@ | 系統全域變數(保留) | @@ROWCOUNT |
禁用:保留字、內建空格/特殊字元(需雙引號或方括號包裹)。
技術上可行,實務上不建議。
SET STATISTICS TIME, IO ON 或 Extended Events 捕獲 CPU、Duration、Logical Reads。Context Switch 開銷:CLR 需在 SQLOS 與 CLR Host 間切換,高併發下顯著。| 方法 | 適用版本 | 優點 | 缺點 |
|---|---|---|---|
| INSERT EXEC | 2000+ | 語法簡單 | 無法巢狀;TempDB 壓力大 |
| Table-Valued Parameter (TVP) | 2008+ | 零拷貝、型別安全 | 需定義 UDT |
| OPENROWSET/OPENDATASOURCE | 2000+ | 跨 Instance | 需啟用 Ad Hoc Distributed Queries |
| CLR 回傳 IEnumerable | 2005+ | 物件導向 | 序列化開銷 |
ROWVERSION / TIMESTAMP 欄位 + WHERE RowVer = @OriginalRowVer。READ_COMMITTED_SNAPSHOT ON(語句級)或 ALLOW_SNAPSHOT_ISOLATION ON(交易級),寫不阻塞讀、讀不阻塞寫。2005 無新索引類型,但增強現有功能:
INCLUDE (col1, col2) 實現覆蓋索引避免 Key Lookup。ONLINE = ON(Enterprise Edition)。真正新類型出現在 2008:空間索引、篩選索引、Columnstore 索引(2012 正式可用)。
-- 參數化、防注入、可重用
CREATE PROCEDURE usp_SelectPaged
@SchemaName sysname,
@TableName sysname,
@PageSize INT = 50,
@PageNumber INT = 1,
@WhereClause NVARCHAR(MAX) = ''
AS
BEGIN
SET NOCOUNT ON;
DECLARE @SQL NVARCHAR(MAX) = N'
SELECT * FROM ' + QUOTENAME(@SchemaName) + '.' + QUOTENAME(@TableName) + '
WHERE 1=1 ' + @WhereClause + '
ORDER BY (SELECT 0)
OFFSET @Offset ROWS FETCH NEXT @PageSize ROWS ONLY;';
EXEC sp_executesql @SQL, N'@Offset INT, @PageSize INT',
@Offset = (@PageNumber - 1) * @PageSize, @PageSize = @PageSize;
END
-- 方法 1:sys.partitions(快、近似)
SELECT OBJECT_SCHEMA_NAME(p.object_id) AS SchemaName,
OBJECT_NAME(p.object_id) AS TableName
FROM sys.partitions p
WHERE p.index_id IN (0,1) AND p.rows = 0;
-- 方法 2:動態 SQL 精確計數(慢、準)
-- 略
這十大問題貫穿 SQL Server 開發全生命週期。建議團隊建立「命名規範文件」、「CLR 使用準則」、「並發控制模式庫」、「腳本模板庫」四大資產,將個人經驗沉澱為組織能力。