簡體   English   中英

存儲過程和用戶​​定義函數之間的差異

[英]Difference between stored procedures and user defined functions

任何人都可以解釋存儲過程和用戶​​定義的函數之間的確切區別,以及每個上下文有用嗎?

這就是我一直記在的:)

  • 過程可以返回零或n值,而函數可以返回一個必需的值。
  • 程序可以有輸入/輸出參數,而函數只能有輸入參數。
  • Procedure允許select和DML語句,而function只允許select語句。
  • 可以從過程調用函數,而不能從函數調用過程。
  • 異常可以通過過程中的try-catch塊來處理,而try-catch塊不能在函數中使用。
  • 我們可以在程序中進行交易管理,但是我們不能進入功能。
  • 程序不能在select語句中使用,而函數可以嵌入select語句中。
  • UDF可以在WHERE / HAVING / SELECT部分​​中的任何位置的SQL語句中使用,而存儲過程則不能。
  • 返回表的UDF可以視為另一個行集。 這可以在JOIN中與其他表一起使用。
  • 內聯UDF可以作為帶參數的視圖,可以在JOIN和其他Rowset操作中使用。

來源http://www.codeproject.com/Tips/286539/Difference-between-stored-procedure-and-function

函數始終返回一個值,並且不能執行DML語句(INSERT / UPDATE / DELETE)。

存儲過程不能返回值 - 您需要使用OUT參數 - 並且可以運行DML語句。

使用函數與存儲過程的優勢?


除了上面的比較,它們是平等的。 但鑒於比較,根據您需要做的事情,您可能會比使用函數更頻繁地使用存儲過程。

用戶定義的函數幾乎沒有限制,比如可以使用DML語句等。請檢查

差異

  1. 程序可以接受輸入(默認),輸出和輸入類型參數。 函數只能接受輸入類型參數。

  2. 程序可能會也可能不會返回值,或者可能使用OUTPUT和/或INOUT參數返回多個值。 一個過程可以通過OUTPUT和/或INOUT參數返回最多1024個值。 函數始終只返回一個值。

  3. 存儲過程默認返回整數值零。 函數返回類型可以是標量或表或表值。

  4. 存儲過程可以創建表但不能返回表。 函數可以創建,更新和刪除表變量。 它可以返回一個表

  5. 存儲過程可以通過使用插入,刪除,更新和創建操作來影響數據庫的狀態。 函數不會影響數據庫的狀態,這意味着我們無法對數據庫執行插入,刪除,更新和創建操作操作。

  6. 存儲過程以編譯形式存儲在數據庫中。 函數僅在運行時進行解析和調整。

  7. 可以使用exec關鍵字獨立調用存儲過程。 存儲過程不能在select / where / having子句中使用。 函數從select / where / having子句調用。 即使我們可以加入兩個功能。

  8. 通常,存儲過程將用於執行特定任務。 函數將用於計算值。 存儲過程允許允許getdate()或其他非確定性函數。 函數不允許像getdate()這樣的非確定性函數。

  9. 在存儲過程中,我們可以使用事務語句。 我們不能在函數中使用。

  10. 存儲過程可以執行所有DML操作,例如插入新記錄,更新記錄和刪除現有記錄。 該函數不允許我們在數據庫表中執行DML操作,就像在存儲過程中一樣。 它允許我們只進行選擇操作。 它不允許在現有表上執行DML。 但是我們仍然只能對用戶定義函數內的表變量進行DML操作。

  11. 可以在存儲過程中創建臨時表(派生)。 在功能方面是不可能的。

  12. 當sql語句遇到錯誤時,T-SQL將忽略SPROC中的錯誤並繼續執行剩余代碼中的下一個語句。 在函數的情況下,T-SQL將停止執行下一個語句。

請參考此鏈接:

https://www.spritle.com/blogs/2011/03/03/differences-between-stored-procedures-and-user-defined-functions/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM