SQL 語句的集合包含在預存程序和函數、用於執行某些任務的資料庫物件中(或也可以在資料科學中使用)。兩者在許多方面都有所不同。
在本文中,我們將詳細討論函數和過程以及它們的差異。
讓我們從預存程序開始 -
簡單編寫的 SQL 程式碼保存起來以供多次重複使用,從而構成了一個預存程序。如果您能想到經常編寫的查詢,則可以將其儲存為預存程序,然後呼叫該預存程序來執行作為預存程序的一部分儲存的 SQL 程式碼。這將使您不必重複編寫相同的問題。
您可以重複執行相同的 SQL 程式碼並向預存程序提供參數。根據需要,預存程序將根據提供的參數值做出適當的回應。
也可以透過預存程序來增強效能。一組 SQL 語句用來執行多項任務。接下來執行哪些 SQL 語句取決於初始 SQL 語句和條件邏輯的結果。這些 SQL 語句及其包含的條件邏輯可以透過將它們寫入預存程序來組合成伺服器上的單一執行計劃。由於所有工作都在伺服器上執行,因此可以執行條件邏輯,而無需將結果傳遞給客戶端。
每個預存程序都由 SQL Server 編譯一次,然後重複使用執行計劃。當經常調用預存程序時,效能提升是巨大的。
如果您的環境中存在網路頻寬問題,預存程序可以將冗長的 SQL 搜尋壓縮為可以透過線路傳輸的單行,您將會感到欣慰。
許多使用者和客戶端應用程式都可以使用預存程序。如果您按照規劃的方法使用它們,則完成開發週期所需的時間會更少。
獨立於基礎表的權限,您可以為使用者提供執行預存程序的存取權限。
SQL Server 支援兩種類型的函數
內建函數依照 Transact-SQL 參考定義進行操作,且不可變更。只有遵循 Transact-SQL 參考既定語法的 Transact-SQL 語句才可以使用這些函式作為參考。
系統已經定義了這些函數。它分為兩類 -
在本教學中,我們將參考下表 -
ID |
姓名 |
標記 |
年齡 |
---|---|---|---|
1 |
嚴厲 |
90 |
19 |
#2 |
蘇雷什 |
#50 |
#20 |
#3 |
普拉蒂克 |
#80 |
#21 |
#4 |
丹拉吉 |
#95 |
#19 |
#5 |
拉姆 |
85 |
#18 |
這些運算將一個值作為輸入並輸出它。一些系統標量操作包括 -
round() - 將數字四捨五入到最接近的三位。例如,round(28.64851) 將產生 28.649
SELECT ROUND(MARKS,0) FROM students;
upper() - upper("english") 傳回英語,lower("ENGLISH") 回傳英語。
SELECT upper(NAME) FROM Students;
HARSH SURESH PRATIK DHANRAJ RAM
rand() - 使用函數 rand(),將會傳回一個範圍內的隨機數。例如,Rand(8),傳回 0.71372242401 或任何其他隨機產生的數字。
這些函數傳回單一值,這些函數使用輸入參數的集合。例子包括 -
Avg() 將為所有提供的輸入提供平均值。
SELECT AVG(MARKS) FROM Students;
80
Count() 此函數將傳回滿足給定條件的行數。
SELECT COUNT(*) FROM Students;
5
Max() 和 min() 函數 max() 和 min() 將傳回所提供參數中的最高值和最低值。
SELECT MAX(AGE) FROM Students
21
SELECT MIN(AGE) FROM Students;
18
使用 CREATE FUNCTION 指令建立自訂 Transact-SQL 函數。使用者定義函數提供單一值,並且需要零到多個輸入參數。某些使用者定義函數 (UDF) 傳回的是單一資料值,例如十進位數、字元或 int。
使用者定義的標量函數為函數操作的每一步輸出一個值。傳回函數中的任何資料類型值。
具有使用者定義值的內聯表函數進行運算並將結果作為表傳回。沒有 BEGIN/END 主體。只需使用一個 SELECT 語句即可獲得結果。
如果使用者定義函數包含不可修改的 SELECT 語句或包含多個 SELECT 語句,則其給予的結果不會變更。我們必須明確指定表變數並描述可以從各種 SQL 查詢中檢索到的值。
支援模組化程式設計
#該函數可以建立一次,保存在資料庫中,然後根據您的需求在軟體中多次使用。無需更改應用程式的原始程式碼即可更改使用者定義的函數。
它們可以加快執行速度
Transact-SQL 使用者定義函數(如預存程序)透過快取計劃並在多次執行中重複使用它們來降低編譯成本。由於使用者定義的函數不需要在每次使用時重新解析和最佳化,因此執行時間明顯縮短。
對於計算工作負載、業務邏輯和字串操作,CLR 函數的效能顯著優於 Transact-SQL 函數。資料存取密集型邏輯更適合 Transact-SQL 操作。
它們可能會減少網路活動。
函數可用來表示基於無法以單一數字表達式表示的複雜限制來過濾資訊的操作。為了減少提供給客戶端的行數,可以在 WHERE 子句中使用該函數。
下表突顯了 SQL 中使用者定義函數和預存程序之間的主要差異 -
標準 |
使用者定義函數 |
#預存程序 |
---|---|---|
傳回值 |
單一值 |
單一、多個甚至零個 |
參數 |
輸入值 |
輸入與輸出值 |
#資料庫 |
無法修改 |
可以修改 |
宣告 |
僅 SELECT 語句 |
SELECT 與 DML 語句 |
呼叫 |
從過程中呼叫 |
#無法從函數呼叫 |
#編譯執行 |
每次都需要編譯 |
#只需編譯一次 |
#交易管理 |
不可能 |
不可能 |
在這篇文章中,我們深入討論了預存程序及其優點、函數、函數的類型以及函數的優點,最後得出函數和預存程序之間的差異。
以上是在 SQL Server 中編寫函數和預存程序的詳細內容。更多資訊請關注PHP中文網其他相關文章!