SQL 語句的集合包含在存儲過程和函數(shù)、用于執(zhí)行某些任務(wù)的數(shù)據(jù)庫對象中(或者也可以在數(shù)據(jù)科學(xué)中使用)。兩者在很多方面都有所不同。
在本文中,我們將詳細(xì)討論函數(shù)和過程以及它們的差異。
讓我們從存儲過程開始 –
SQL 中的存儲過程
簡單編寫的 SQL 代碼保存起來以供多次重用,從而構(gòu)成了一個存儲過程。如果您能想到經(jīng)常編寫的查詢,則可以將其保存為存儲過程,然后調(diào)用該存儲過程來運(yùn)行作為存儲過程的一部分保存的 SQL 代碼。這將使您不必重復(fù)編寫相同的問題。
您可以重復(fù)執(zhí)行相同的 SQL 代碼并向存儲過程提供參數(shù)。根據(jù)需要,存儲過程將根據(jù)提供的參數(shù)值做出適當(dāng)?shù)捻憫?yīng)。
還可以通過存儲過程來增強(qiáng)性能。一組 SQL 語句用于執(zhí)行多項(xiàng)任務(wù)。接下來運(yùn)行哪些 SQL 語句取決于初始 SQL 語句和條件邏輯的結(jié)果。這些 SQL 語句及其包含的條件邏輯可以通過將它們寫入存儲過程來組合成服務(wù)器上的單個執(zhí)行計劃。由于所有工作都在服務(wù)器上執(zhí)行,因此可以執(zhí)行條件邏輯,而無需將結(jié)果傳遞給客戶端。
存儲過程的優(yōu)點(diǎn)
編譯執(zhí)行
每個存儲過程都由 SQL Server 編譯一次,然后重用執(zhí)行計劃。當(dāng)經(jīng)常調(diào)用存儲過程時,性能提升是巨大的。
客戶端/服務(wù)器流量減少
如果您的環(huán)境中存在網(wǎng)絡(luò)帶寬問題,存儲過程可以將冗長的 SQL 搜索壓縮為可以通過線路傳輸?shù)膯涡校鷮械叫牢俊?
有效的代碼重用和編程抽象
許多用戶和客戶端應(yīng)用程序都可以使用存儲過程。如果您按照計劃的方法使用它們,則完成開發(fā)周期所需的時間會更少。
加強(qiáng)安全措施
獨(dú)立于基礎(chǔ)表的權(quán)限,您可以為用戶提供運(yùn)行存儲過程的訪問權(quán)限。
SQL 中的函數(shù)
SQL Server 支持兩種類型的函數(shù)
內(nèi)置函數(shù)
內(nèi)置函數(shù)按照 Transact-SQL 參考定義進(jìn)行操作,并且不可更改。只有遵循 Transact-SQL 參考既定語法的 Transact-SQL 語句才可以使用這些函數(shù)作為參考。
系統(tǒng)已經(jīng)定義了這些函數(shù)。它分為兩類 –
在本教程中,我們將參考下表 –
ID |
姓名 |
標(biāo)記 |
年齡 |
---|---|---|---|
1 |
嚴(yán)厲 |
90 |
19 |
2 |
蘇雷什 |
50 |
20 |
3 |
普拉蒂克 |
80 |
21 |
4 |
丹拉吉 |
95 |
19 |
5 |
拉姆 |
85 |
18 |
標(biāo)量函數(shù)
這些操作將一個值作為輸入并輸出它。一些系統(tǒng)標(biāo)量操作包括 –
round() – 將數(shù)字四舍五入到最接近的三位。例如,round(28.64851) 將產(chǎn)生 28.649
SELECT ROUND(MARKS,0) FROM students;
登錄后復(fù)制
upper() – upper(“english”) 返回英語,lower(“ENGLISH”) 返回英語。
SELECT upper(NAME) FROM Students;
登錄后復(fù)制
輸出
HARSH SURESH PRATIK DHANRAJ RAM
登錄后復(fù)制
rand() – 使用函數(shù) rand(),將返回一個范圍內(nèi)的隨機(jī)數(shù)。例如,Rand(8),返回 0.71372242401 或任何其他隨機(jī)生成的數(shù)字。
系統(tǒng)聚合函數(shù)
這些函數(shù)返回單個值,這些函數(shù)使用輸入?yún)?shù)的集合。例子包括 –
Avg() 將為所有提供的輸入提供平均值。
示例
SELECT AVG(MARKS) FROM Students;
登錄后復(fù)制
輸出
80
登錄后復(fù)制
Count() 此函數(shù)將返回滿足給定條件的行數(shù)。
示例
SELECT COUNT(*) FROM Students;
登錄后復(fù)制
輸出
5
登錄后復(fù)制
Max() 和 min() 函數(shù) max() 和 min() 將返回所提供參數(shù)中的最高值和最低值。
示例
SELECT MAX(AGE) FROM Students
登錄后復(fù)制
輸出
21
登錄后復(fù)制
示例
SELECT MIN(AGE) FROM Students;
登錄后復(fù)制
輸出
18
登錄后復(fù)制
用戶定義函數(shù)
使用 CREATE FUNCTION 命令創(chuàng)建自定義 Transact-SQL 函數(shù)。用戶定義函數(shù)提供單個值,并且需要零到多個輸入?yún)?shù)。某些用戶定義函數(shù) (UDF) 返回的是單個數(shù)據(jù)值,例如十進(jìn)制數(shù)、字符或 int。
標(biāo)量運(yùn)算
用戶定義的標(biāo)量函數(shù)為函數(shù)操作的每一步輸出一個值。返回函數(shù)中的任何數(shù)據(jù)類型值。
表值函數(shù)
內(nèi)聯(lián)函數(shù)
具有用戶定義值的內(nèi)聯(lián)表函數(shù)進(jìn)行運(yùn)算并將結(jié)果作為表返回。沒有 BEGIN/END 主體。只需使用一個 SELECT 語句即可獲得結(jié)果。
多語句函數(shù)
如果用戶定義函數(shù)包含不可修改的 SELECT 語句或包含多個 SELECT 語句,則其給出的結(jié)果不會更改。我們必須顯式指定表變量并描述可以從各種 SQL 查詢中檢索到的值。
用戶定義函數(shù)的優(yōu)點(diǎn)
支持模塊化編程
該函數(shù)可以創(chuàng)建一次,保存在數(shù)據(jù)庫中,然后根據(jù)您的需要在軟件中多次使用。無需更改應(yīng)用程序的源代碼即可更改用戶定義的函數(shù)。
它們可以加快執(zhí)行速度
Transact-SQL 用戶定義函數(shù)(如存儲過程)通過緩存計劃并在多次執(zhí)行中重用它們來降低編譯成本。由于用戶定義的函數(shù)不需要在每次使用時重新解析和優(yōu)化,因此執(zhí)行時間明顯縮短。
對于計算工作負(fù)載、業(yè)務(wù)邏輯和字符串操作,CLR 函數(shù)的性能顯著優(yōu)于 Transact-SQL 函數(shù)。數(shù)據(jù)訪問密集型邏輯更適合 Transact-SQL 操作。
它們可能會減少網(wǎng)絡(luò)活動。
函數(shù)可用于表示基于無法用單個數(shù)字表達(dá)式表示的復(fù)雜約束來過濾信息的操作。為了減少提供給客戶端的行數(shù),可以在 WHERE 子句中使用該函數(shù)。
用戶定義函數(shù)和存儲過程的區(qū)別
下表突出顯示了 SQL 中用戶定義函數(shù)和存儲過程之間的主要區(qū)別 –
標(biāo)準(zhǔn) |
用戶定義函數(shù) |
存儲過程 |
---|---|---|
返回值 |
單一值 |
單個、多個甚至零個 |
參數(shù) |
輸入值 |
輸入和輸出值 |
數(shù)據(jù)庫 |
無法修改 |
可以修改 |
聲明 |
僅 SELECT 語句 |
SELECT 和 DML 語句 |
呼叫 |
從過程中調(diào)用 |
無法從函數(shù)調(diào)用 |
編譯執(zhí)行 |
每次都需要編譯 |
只需編譯一次 |
交易管理 |
不可能 |
不可能 |
結(jié)論
在這篇文章中,我們深入討論了存儲過程及其優(yōu)點(diǎn)、函數(shù)、函數(shù)的類型以及函數(shù)的優(yōu)點(diǎn),最后得出函數(shù)和存儲過程之間的區(qū)別。
以上就是在 SQL Server 中編寫函數(shù)和存儲過程的詳細(xì)內(nèi)容,更多請關(guān)注www.92cms.cn其它相關(guān)文章!