SQL 語句的集合包含在存儲過程和函數、用于執行某些任務的數據庫對象中(或者也可以在數據科學中使用)。兩者在很多方面都有所不同。
在本文中,我們將詳細討論函數和過程以及它們的差異。
讓我們從存儲過程開始 –
SQL 中的存儲過程
簡單編寫的 SQL 代碼保存起來以供多次重用,從而構成了一個存儲過程。如果您能想到經常編寫的查詢,則可以將其保存為存儲過程,然后調用該存儲過程來運行作為存儲過程的一部分保存的 SQL 代碼。這將使您不必重復編寫相同的問題。
您可以重復執行相同的 SQL 代碼并向存儲過程提供參數。根據需要,存儲過程將根據提供的參數值做出適當的響應。
還可以通過存儲過程來增強性能。一組 SQL 語句用于執行多項任務。接下來運行哪些 SQL 語句取決于初始 SQL 語句和條件邏輯的結果。這些 SQL 語句及其包含的條件邏輯可以通過將它們寫入存儲過程來組合成服務器上的單個執行計劃。由于所有工作都在服務器上執行,因此可以執行條件邏輯,而無需將結果傳遞給客戶端。
存儲過程的優點
編譯執行
每個存儲過程都由 SQL Server 編譯一次,然后重用執行計劃。當經常調用存儲過程時,性能提升是巨大的。
客戶端/服務器流量減少
如果您的環境中存在網絡帶寬問題,存儲過程可以將冗長的 SQL 搜索壓縮為可以通過線路傳輸的單行,您將會感到欣慰。
有效的代碼重用和編程抽象
許多用戶和客戶端應用程序都可以使用存儲過程。如果您按照計劃的方法使用它們,則完成開發周期所需的時間會更少。
加強安全措施
獨立于基礎表的權限,您可以為用戶提供運行存儲過程的訪問權限。
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 中編寫函數和存儲過程的詳細內容,更多請關注www.92cms.cn其它相關文章!