常見需求:已有查詢類存儲過程 (如 sp_GetBorrowRecord) 返回結果集,新功能需對該結果集進一步聚合分析 (如按書籍類型分組統計)。為避免重複 SQL、利於維護,可直接複用現有 SP 結果。
CREATE PROCEDURE sp_GetBorrowAnalysis
@BeginTime DATETIME,
@EndTime DATETIME
AS
BEGIN
-- 表變量結構必須與 sp_GetBorrowRecord 返回結果集完全一致
DECLARE @Record TABLE (
BookID INT, -- 書籍 ID
BookName VARCHAR(100),-- 書籍名稱
TypeID INT, -- 書籍類別 ID
CardID INT, -- 借書卡 ID
CardName VARCHAR(100) -- 借書人姓名
);
-- 核心語法:INSERT INTO @TableVar EXEC sp_Name @Params
INSERT INTO @Record
EXEC sp_GetBorrowRecord @BeginTime, @EndTime;
| 優點 | 缺點 |
|---|---|
| 避免重複 SQL,單一維護入口 | 大數據量下效能較差 (表變量無統計資訊、易產生 TempDB 爭用) |
| 業務邏輯集中,修改查詢條件只需改源 SP | 無法使用平行查詢 |
| 程式碼可讀性高,符合 DRY 原則 | 嵌套層級過深可能觸發限制 (MAX_NESTING_LEVEL = 32) |
#TempTable) 替代表變量,擁有統計資訊、支援索引Inline Table-Valued Function,直接 CROSS APPLY 或 JOINOPENROWSET / OPENQUERY (需啟用 Ad Hoc Distributed Queries)此技巧適用於中小型資料量、高維護性需求的場景;大數據高併發建議採用函數化或暫存表方案。