將預存程序重寫為函數

本節將介紹如何決定是否要將現有的預存程序邏輯,重寫為使用者自訂函數。例如,如果您要直接從查詢叫用預存程序,則必須將程式碼重新封裝成使用者自訂函數。

一般而言,如果預存程序會傳回單一結果集,則應定義資料表值函數。如果預存程序會計算數值類值,則應定義數值類函數。

資料表數值函數的條件

如果預存程序符合下列條件,則適合重寫為資料表數值函數:

  • 單一 SELECT 陳述式中的邏輯是屬於可運算的,但因為它需要參數,所以是預存程序而非檢視。這個情況可以利用內嵌資料表數值函數來處理。

  • 預存程序不執行更新作業 (資料表變數除外)。

  • 不需要動態的 EXECUTE 陳述式

  • 預存程序會傳回一個結果集。

  • 預存程序的主要目的是要建立載入暫存資料表的立即結果,以便在 SELECT 陳述式中接受查詢。INSERT...EXEC 陳述式可利用資料表數值函數來寫入。例如,您可以參考以下兩個序列:

    INSERT #temp EXEC sp_getresults
    SELECT ...
    FROM #temp, t1
    WHERE ...
    

    sp_getresults 預存程序可重寫為資料表值函數,例如 fn_results(),這表示上述陳述式可重寫為:

    INSERT #temp
    SELECT ...
    FROM fn_results(), t1
    WHERE ...
    

使用 CLR 重寫擴充預存程序

CLR 函數提供更可靠、可擴充的替代方案來擴充預存程序。許多擴充預存程序所執行的運算工作,很難以 Transact-SQL 來表達。這種預存程序可使用 CLR 重寫,便能擁有上述好處。此外,需存取外部資源 (例如檔案或 Web 服務) 而傳回結果集的擴充預存程序,則可使用 CLR 資料表值函數來重寫。如需詳細資訊,請參閱<建立 CLR 函數>。