針對開發者最常遇到的 10 個 SQL Server 疑難雜症,提供權威解答與最佳實踐代碼,涵蓋命名規範、CLR vs T-SQL 效能、並發控制、管理工具變更、索引新特性、空表檢測腳本。
技術上可行 (用 ADO.NET 類在 CLR 內存取資料),但無 T-SQL 無法訪問資料。CLR 適合:複雜運算、正則表達式、檔案/網路操作、加密;資料存取仍建議 T-SQL。混合模式:CLR 呼叫 T-SQL 或反之。
CREATE PROC usp_Demo_AllAuthors AS SELECT * FROM pubs..authors; GO CREATE PROC usp_Demo_SPUser AS BEGIN CREATE TABLE #Authors (au_id VARCHAR(11) PRIMARY KEY, ...); INSERT INTO #Authors EXEC usp_Demo_AllAuthors; -- 核心:INSERT EXEC SELECT au_fname + ' ' + au_lname AS name FROM #Authors; DROP TABLE #Authors; END; GO
限制:來源 SP 僅能回傳單一結果集;多結果集需改用 OPENROWSET 或重構。
問題:SELECT free_seats ... IF >0 INSERT 非原子,雙併發超賣。
方案 A:唯一鍵約束。每座位一列,UNIQUE (SeatID),INSERT 失敗即表示已售出,無需額外鎖。
方案 B:Service Broker。每車建立會話,座位訊息入佇列,RECEIVE 原子取出,天然防重複。
SQL Server Management Studio (SSMS):整合 Enterprise Manager + Query Analyzer,UI 升級、IntelliSense、物件總管、內建報表、政策管理。
SET FIPS_FLAGGER ON 會標記非標準語法。關聯表無新索引類型 (仍為 B-tree 叢集/非叢集)。增強點:
• 全文檢索重寫 (支援語義、鄰近搜尋)
• XML 索引 (主 XML 索引 + 路徑/屬性/值次要索引)
• 線上索引操作 (ONLINE=ON):重建/重組不鎖表,維護窗口歸零。
SELECT t.prod_key, t.item_key, t.pack_key, t.last_sale FROM YourTable t JOIN ( SELECT item_key, pack_key, MAX(last_sale) AS max_sale FROM YourTable GROUP BY item_key, pack_key ) m ON t.item_key = m.item_key AND t.pack_key = m.pack_key AND t.last_sale = m.max_sale;
DECLARE @sql NVARCHAR(MAX) = N''; SELECT @sql += 'SELECT ''' + name + ''' AS TableName, COUNT(*) AS Cnt FROM ' + QUOTENAME(name) + '; ' FROM sys.objects WHERE type = 'U'; EXEC sp_executesql @sql; -- 或直接查系統表 (極快) SELECT o.name, i.rowcnt FROM sysobjects o JOIN sysindexes i ON o.id = i.id WHERE o.type = 'U' AND i.indid IN (0,1) AND i.rowcnt = 0;