共用方式為


將預存程序重寫為函數

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

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

資料表數值函數的條件

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

  • 單一 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 函數>。