單一 RETURN (SELECT ...),無 BEGIN/END,最佳化器可展開合併至外層查詢計畫,**效能最佳**。
CREATE FUNCTION Fun_GetReportNews(@type VARCHAR(10))
RETURNS TABLE
AS
RETURN (
SELECT TPR_ID, TPR_Title, TPR_Date
FROM TP_ReportNews
WHERE TPR_Type = @type
);
GO
-- 呼叫
SELECT * FROM Fun_GetReportNews('News');
需宣告 RETURNS @Table TABLE (...),函數體用 BEGIN/END,可包含變數、流程控制、多步驟邏輯,**最佳化器視為黑盒**,效能較差。
CREATE FUNCTION FUN_GetInfoList(@type VARCHAR(10))
RETURNS @Table TABLE (TPR_ID INT, TPR_Title NVARCHAR(100), TPR_PubDate DATETIME)
AS
BEGIN
DECLARE @a VARCHAR(10);
SELECT @a = xx FROM XX WHERE xx = @type;
INSERT @Table SELECT XX, XX, XX FROM TableName WHERE XX = @a;
RETURN;
END;
GO
#temp),只能用**表變數** (@Table)。GETDATE(), NEWID()) — 內嵌 TVF 亦同。
CREATE FUNCTION FUN_DataFormat(@strDate DATETIME)
RETURNS VARCHAR(20)
AS
BEGIN
DECLARE @date VARCHAR(20);
SET @date = DATENAME(YY, @strDate) + '年' + CONVERT(VARCHAR, MONTH(@strDate)) + '月' + CONVERT(VARCHAR, DAY(@strDate)) + '日';
RETURN @date;
END;
GO
-- 呼叫需加 dbo 前綴,避免誤判為系統函數
SELECT dbo.FUN_DataFormat(GETDATE());
| 類型 | 適用場景 | 效能 | 最佳化器行為 |
|---|---|---|---|
| 內嵌 TVF | 單一 SELECT、參數化視圖替代 | 極佳 (計畫合併) | 展開合併 |
| 多陳述式 TVF | 需變數、IF/ELSE、多步驟邏輯 | 較差 (黑盒、估計列數固定 100) | 獨立計畫 |
| 標量 UDF | 單值轉換、計算 | 極差 (逐列呼叫、阻礙平行) | 黑盒 |
SCALAR UDF INLINING 可自動將符合條件的標量 UDF 內嵌化。fn_ 或 tvf_ 前綴。READONLY 表值參數 (TVP)。