SQL Server 開發過程中,命名規範、預存程序設計、並發控制、工具選擇、索引策略等問題高頻出現。本文針對十大典型問題提供專家級解答與最佳實踐建議。
技術上可行,但無法存取資料。 CLR 預存程序透過 ADO.NET 存取資料,最終仍需發送 T-SQL 指令。適用場景:檔案處理、網路服務呼叫、複雜運算、正則表達式等「非資料存取」邏輯。資料密集型操作仍建議用 T-SQL。
核心技巧:暫存表 + INSERT EXEC。
CREATE PROC usp_GetAuthors AS SELECT * FROM Authors; -- 來源程序
CREATE PROC usp_ProcessAuthors AS
CREATE TABLE #TmpAuthors ( ... ); -- 定義結構
INSERT #TmpAuthors EXEC usp_GetAuthors; -- 捕獲結果集
SELECT * FROM #TmpAuthors WHERE ...; -- 後續處理
DROP TABLE #TmpAuthors;
前提:來源程序僅回傳單一結果集。
場景:檢查剩餘座位 → 插入售票。高併發下「查詢-插入」非原子導致超賣。
方案 A:唯一約束 + 業務鍵 為每個座位建立唯一識別碼,建表 Bookings(SeatID UNIQUE)。插入衝突自動失敗,應用層捕獲錯誤重試。
方案 B:Service Broker 隊列單一消費者 每班車建立一個會話/隊列,座位作為訊息入隊。RECEIVE 保證單一消費者處理,天然序列化,零並發衝突。
SQL Server Management Studio (SSMS):整合查詢編輯、物件瀏覽、效能報表、原則管理、部署精靈的統一管理介面。
sys.columns 動態拼接欄位清單。-- 方法 1: 系統視圖 (快速、近似)
SELECT OBJECT_NAME(object_id) AS TableName
FROM sys.partitions
WHERE index_id IN (0,1) AND rows = 0 AND OBJECTPROPERTY(object_id, 'IsUserTable') = 1;
-- 方法 2: 動態 SQL (精確、較慢)
DECLARE @sql NVARCHAR(MAX) = '';
SELECT @sql += 'IF NOT EXISTS (SELECT 1 FROM ' + QUOTENAME(schema_name(schema_id)) + '.' + QUOTENAME(name) + ') PRINT ''' + QUOTENAME(schema_name(schema_id)) + '.' + QUOTENAME(name) + ''';'
FROM sys.tables;
EXEC sp_executesql @sql;