[英]Difference between stored procedures and user defined functions
任何人都可以解釋存儲過程和用戶定義的函數之間的確切區別,以及每個上下文有用嗎?
這就是我一直記在的:)
來源http://www.codeproject.com/Tips/286539/Difference-between-stored-procedure-and-function
函數始終返回一個值,並且不能執行DML語句(INSERT / UPDATE / DELETE)。
存儲過程不能返回值 - 您需要使用OUT參數 - 並且可以運行DML語句。
除了上面的比較,它們是平等的。 但鑒於比較,根據您需要做的事情,您可能會比使用函數更頻繁地使用存儲過程。
用戶定義的函數幾乎沒有限制,比如可以使用DML語句等。請檢查
差異 :
程序可以接受輸入(默認),輸出和輸入類型參數。 函數只能接受輸入類型參數。
程序可能會也可能不會返回值,或者可能使用OUTPUT和/或INOUT參數返回多個值。 一個過程可以通過OUTPUT和/或INOUT參數返回最多1024個值。 函數始終只返回一個值。
存儲過程默認返回整數值零。 函數返回類型可以是標量或表或表值。
存儲過程可以創建表但不能返回表。 函數可以創建,更新和刪除表變量。 它可以返回一個表
存儲過程可以通過使用插入,刪除,更新和創建操作來影響數據庫的狀態。 函數不會影響數據庫的狀態,這意味着我們無法對數據庫執行插入,刪除,更新和創建操作操作。
存儲過程以編譯形式存儲在數據庫中。 函數僅在運行時進行解析和調整。
可以使用exec關鍵字獨立調用存儲過程。 存儲過程不能在select / where / having子句中使用。 函數從select / where / having子句調用。 即使我們可以加入兩個功能。
通常,存儲過程將用於執行特定任務。 函數將用於計算值。 存儲過程允許允許getdate()或其他非確定性函數。 函數不允許像getdate()這樣的非確定性函數。
在存儲過程中,我們可以使用事務語句。 我們不能在函數中使用。
存儲過程可以執行所有DML操作,例如插入新記錄,更新記錄和刪除現有記錄。 該函數不允許我們在數據庫表中執行DML操作,就像在存儲過程中一樣。 它允許我們只進行選擇操作。 它不允許在現有表上執行DML。 但是我們仍然只能對用戶定義函數內的表變量進行DML操作。
可以在存儲過程中創建臨時表(派生)。 在功能方面是不可能的。
當sql語句遇到錯誤時,T-SQL將忽略SPROC中的錯誤並繼續執行剩余代碼中的下一個語句。 在函數的情況下,T-SQL將停止執行下一個語句。
請參考此鏈接:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.