本文描述了SQL Server中存儲過程和用戶定義函數之間的區別。
存儲過程(Stored Procedure)
存儲過程只不過是您事先保存好的SQL代碼而已,您可以反復使用該代碼。 如果您一遍又一遍地寫一個查詢,而又不想每次都寫該查詢,則可以將其保存為存儲過程,然后只需調用該存儲過程即可。
除了反復運行相同的SQL代碼之外,您還可以向存儲過程傳遞參數,因此根據需要,存儲過程可以根據傳遞的參數值進行相應的操作。
存儲過程也可以提高性能,許多任務被實現為一系列SQL語句。 應用于第一個SQL語句的結果的條件邏輯確定執行哪些后續SQL語句,如果將這些SQL語句和條件邏輯寫入存儲過程,則它們將成為服務器上單個執行計劃的一部分,無需將結果返回給客戶端即可應用條件邏輯,所有工作都在服務器上完成。
存儲過程的好處
- 預編譯的執行
SQL Server將每個存儲過程編譯一次,然后重用執行計劃。在重復調用存儲過程時,這會極大地提高性能。
- 減少了客戶端/服務器的流量
如果在您的環境中需要考慮網絡帶寬,那么您會很高興地了解到存儲過程可以將長SQL查詢減少到通過網絡傳輸的單行。
- 高效地重用代碼和編程抽象
存儲過程可以由多個用戶和客戶端程序使用。 如果您有計劃地利用它們,那么您會發現開發周期所需的時間更少。
- 增強的安全控制
您可以授予用戶獨立于基礎表權限執行存儲過程的權限。
用戶定義函數(User Defined Functions)
與編程語言中的函數一樣,SQL Server用戶定義函數是接受參數、執行操作(比如復雜計算)并返回該操作結果的例程。返回值可以是單個標量值,也可以是結果集。
程序設計語言中的函數是用來封裝經常執行的邏輯的子程序。任何必須執行合并到函數中的邏輯的代碼都可以調用該函數,而不必重復所有的函數邏輯。
SQL Server支持兩種類型的函數
- 內置函數
按照Transact-SQL參考中的定義進行操作,無法進行修改。只能使用Transact-SQL參考中定義的語法在Transact-SQL語句中引用這些函數。
- 用戶定義函數
允許使用CREATE FUNCTION語句定義自己的Transact-SQL函數。用戶定義的函數使用零個或多個輸入參數,并返回單個值。一些用戶定義的函數返回單個標量數據值,例如int、char或decimal值。
用戶定義函數的好處
- 它們允許模塊化編程
您可以只創建一次函數,將其存儲在數據庫中,并在程序中多次調用它。用戶定義的函數可以獨立于程序源代碼進行修改。
- 它們可以更快地執行
與存儲過程類似,Transact-SQL用戶定義的函數通過緩存計劃并重用它們進行重復執行,降低了Transact-SQL代碼的編譯成本。這意味著用戶定義的函數不需要在每次使用時重新解析和優化,從而大大加快執行速度。對于計算任務、字符串操作和業務邏輯,CLR函數比Transact-SQL函數提供了顯著的性能優勢。Transact-SQL函數更適合數據訪問密集型邏輯。
- 它們可以減少網絡流量
可以將無法基于單個標量表達式表達的復雜約束條件過濾數據的操作表示為一個函數。 然后可以在WHERE子句中調用該函數,以減少發送給客戶端的行數。
SQL Server中存儲過程和用戶定義函數的區別
SQL Server中存儲過程和用戶定義函數的區別