傳統處理逐行邏輯(如漢字轉拼音)需使用游標:開啟游標 → 逐行 FETCH → 查表轉換 → 更新回寫。游標缺點:記憶體佔用大、鎖定資源、大數據集處理極慢。
UDF 允許將邏輯封裝為**可在 SQL 陳述式中直接呼叫的函數**,引擎內部優化執行,避免游標開銷。
CREATE FUNCTION Translate(@Original_Text VARCHAR(100))
RETURNS VARCHAR(500)
AS
BEGIN
DECLARE @intLength TINYINT, @strTemp VARCHAR(10)
DECLARE @strResult VARCHAR(500), @strChar VARCHAR(2)
DECLARE @i TINYINT
SET @intLength = LEN(@Original_Text)
SET @strResult = ''
SET @i = 1
WHILE @i <= @intLength
BEGIN
SELECT @strChar = SUBSTRING(@Original_Text, @i, 1)
SET @strTemp = NULL
SELECT @strTemp = spell FROM wordspell WHERE Word = @strChar
SET @strResult = @strResult + ISNULL(@strTemp, @strChar)
SET @i = @i + 1
END
RETURN @strResult
END
GO
-- 單一陳述式完成批次更新
UPDATE phonecode
SET namesame = Translate(name),
addsame = Translate(address)
CREATE PROC trans AS
DECLARE @i INT, @char VARCHAR(2), @tempchr VARCHAR(2)
DECLARE @strtemp VARCHAR(100), @strtemp1 VARCHAR(100)
DECLARE @strname VARCHAR(100), @straddr VARCHAR(100)
DECLARE Cur_trans CURSOR LOCAL DYNAMIC FOR
SELECT [name], [address] FROM phonecode
OPEN Cur_trans
FETCH Cur_trans INTO @strname, @straddr
SET NOCOUNT ON
WHILE @@FETCH_STATUS = 0
BEGIN
-- 處理姓名
SET @i = 1
SET @strtemp = ''
SET @strname = LTRIM(RTRIM(@strname))
WHILE @i <= LEN(@strname)
BEGIN
SELECT @char = SUBSTRING(@strname, @i, 1)
SET @tempchr = NULL
SELECT @tempchr = spell FROM TYPER.wordspell WHERE Word = @char
SET @strtemp = @strtemp + ISNULL(@tempchr, @char)
SET @i = @i + 1
END
-- 處理地址(邏輯重複)
SET @i = 1
SET @strtemp1 = ''
SET @char = ''
SET @straddr = LTRIM(RTRIM(@straddr))
WHILE @i <= LEN(@straddr)
BEGIN
SELECT @char = SUBSTRING(@straddr, @i, 1)
SET @tempchr = NULL
SELECT @tempchr = spell FROM TYPER.wordspell WHERE Word = @char
SET @strtemp1 = @strtemp1 + ISNULL(@tempchr, @char)
SET @i = @i + 1
END
UPDATE phonecode
SET namesame = @strtemp, addsame = @strtemp1
WHERE CURRENT OF Cur_trans
FETCH NEXT FROM Cur_trans INTO @strname, @straddr
END
CLOSE Cur_trans
DEALLOCATE Cur_trans
| 類型 | 回傳值 | 適用場景 | 範例 |
|---|---|---|---|
| 標量函數 | 單一值 | 字串處理、計算、格式轉換 | Translate()、計算稅額 |
| 內嵌資料表值函數 | 資料表(單一 SELECT) | 參數化檢視表、複雜篩選邏輯 | 取得客戶最近 N 筆訂單 |
| 多陳述式資料表值函數 | 資料表(多步驟建構) | 複雜資料轉換管線 | ETL 中間處理步驟 |
WITH SCHEMABINDING,允許優化器更多最佳化機會WITH SCHEMABINDING,除非確有結構變更需求