SQLServer之函數簡介

用戶定義函數定義

與編程語言中的函數類似,SQL Server 用戶定義函數是接受參數、執行操作(例如復雜計算)并將操作結果以值的形式返回的例程。 返回值可以是單個標量值或結果集。

用戶定義函數準則

在函數中,將會區別處理導致語句被取消并繼續執行模塊(如觸發器或存儲過程)中的下一個語句的 Transact-SQL 錯誤。 在函數中,上述錯誤會導致停止執行函數。 接下來該操作導致取消調用該函數的語句。

BEGIN...END 塊中的語句不能有任何副作用。 函數副作用是指對具有函數外作用域(例如數據庫表的修改)的資源狀態的任何永久性更改。 函數中的語句唯一能做的更改是對函數上的局部對象(如局部游標或局部變量)的更改。 不能在函數中執行的操作包括:對數據庫表的修改,對不在函數上的局部游標進行操作,發送電子郵件,嘗試修改目錄,以及生成返回至用戶的結果集。

如果 CREATE FUNCTION 語句對在發出 CREATE FUNCTION 語句時不存在的資源產生副作用,SQL Server 將執行該語句。 但在調用函數時, SQL Server 不執行此函數。

在查詢中指定的函數的實際執行次數在優化器生成的執行計劃間可能不同。 示例為 WHERE 子句中的子查詢調用的函數。 子查詢及其函數執行的次數會因優化器選擇的訪問路徑的不同而異。

用戶定義函數分類

標量函數

用戶定義標量函數返回在 RETURNS 子句中定義的類型的單個數據值。 對于內聯標量函數,沒有函數體;標量值是單個語句的結果。 對于多語句標量函數,定義在 BEGIN...END 塊中的函數體包含一系列返回單個值的 Transact-SQL 語句。 返回類型可以是任何數據類型除外text, ntext, image, cursor,和timestamp。

表值函數

用戶定義表值函數返回table數據類型。 對于內聯表值函數,沒有函數主體;表是單個 SELECT 語句的結果集。

系統函數

SQL Server 提供了許多系統函數,可用于執行各種操作。 這些函數不能修改。 有關詳細信息,請參閱內置函數 (Transact-SQL)、系統存儲函數 (Transact-SQL) 和動態管理視圖和函數 (Transact-SQL)。

內置函數

聚合函數
聚合函數對一組值執行計算,并返回單個值。 在 select 列表或 SELECT 語句的 HAVING 子句中允許使用它們。 可以將聚合與 GROUP BY 子句結合使用,來計算行類別的聚合。

使用 OVER 子句來計算特定范圍內的值的聚合。 OVER 子句不能跟在 GROUPING 或 GROUPING_ID 聚合后。

聚合函數對一組值執行計算,并返回單個值。 除了 COUNT 外,聚合函數都會忽略 Null 值。

所有聚合函數均為確定性函數。 換言之,每次使用一組特定的輸入值調用聚合函數時,它們所返回的值都是相同的。 有關函數確定性的詳細信息,請參閱確定性函數和不確定性函數。

只能在以下位置將聚合函數作為表達式使用:

SELECT 語句的選擇列表(子查詢或外部查詢)。
HAVING 子句。
分析函數
解析函數基于一組行計算聚合值。 不過,與聚合函數不同,分析函數可能針對每個組返回多行。 可以使用分析函數來計算移動平均線、運行總計、百分比或一個組內的前 N 個結果。

排名函數
排名函數為分區中的每一行返回一個排名值。 根據所用函數的不同,某些行可能與其他行接收到相同的值。 排名函數具有不確定性。

行集函數
行集函數 返回可在 SQL 語句中像表引用一樣使用的對象。

標量函數
對單一值進行運算,然后返回單一值。 只要表達式有效,即可使用標量函數。

系統存儲函數

SQL Server 提供了以下組的系統函數:Always On 可用性組函數、變更數據捕獲函數、更改跟蹤函數、據收集器函數、Filestream 和 FileTable 函數、托管備份函數、sys.fn_get_sql、sys.fn_MSxe_read_event_stream、sys.fn_stmt_sql_handle_from_sql_stmt、sys.fn_validate_plan_guide、sys.fn_xe_file_target_read_file、sys.fn_backup_file_snapshots、語義全文搜索函數、系統元數據函數、系統安全函數、系統跟蹤函數。

動態管理視圖函數

動態管理視圖和函數返回可用于監視服務器實例的運行狀況、診斷故障以及優化性能的服務器狀態信息。

動態管理視圖和函數分為兩種類型:

服務器范圍內的動態管理視圖和函數。 此類型需要具有該服務器的 VIEW SERVER STATE 權限。

數據庫范圍內的動態管理視圖和函數。 此類型需要具有該數據庫的 VIEW DATABASE STATE 權限。

用戶定義函數輸入

用戶定義函數采用零個或多個輸入參數并返回標量值或表。 一個函數最多可以有 1024 個輸入參數。 如果函數的參數有默認值,則調用該函數時必須指定 DEFAULT 關鍵字,才能獲取默認值。 此行為與在用戶定義存儲過程中具有默認值的參數不同,在后一種情況下,忽略參數同樣意味著使用默認值。

用戶定義函數輸出

用戶定義函數不支持輸出參數。

標量函數返回的是一個數據類型值。

內聯表值函數返回的是一個table。

系統函數用戶執行指定操作,可以返回數據類型值或者table。

用戶自定義函數應用場景

具有重復代碼、功能和代碼塊的地方,應使用函數以使代碼具有更好的可維護性、可重用性和更少的復雜性。

需要對表中數據進行簡單處理,例如數學計算時可以考慮使用函數。

只有查詢功能時應優先考慮視圖,包含查詢和其他操作的應優先考慮函數。

用戶自定義函數優點

在 SQL Server 中使用用戶定義函數有以下優點:

允許模塊化程序設計。

只需創建一次函數并將其存儲在數據庫中,以后便可以在程序中調用任意次。 用戶定義函數可以獨立于程序源代碼進行修改。

執行速度更快。

與存儲過程相似,Transact-SQL 用戶定義函數通過緩存計劃并在重復執行時重用它來降低 Transact-SQL 代碼的編譯開銷。這意味著每次使用用戶定義函數時均無需重新解析和重新優化,從而縮短了執行時間。

和用于計算任務、字符串操作和業務邏輯的 Transact-SQL 函數相比,CLR 函數具有顯著的性能優勢。 Transact-SQL 函數更適用于數據訪問密集型邏輯。

減少網絡流量。

基于某種無法用單一標量的表達式表示的復雜約束來過濾數據的操作,可以表示為函數。 然后,此函數便可以在 WHERE 子句中調用,以減少發送至客戶端的數字或行數。

查詢中的 Transact-SQL 用戶定義函數只能針對單個線程執行(串行執行計劃)。

用戶自定義函數缺點

用戶自定義函數不能用于執行一系列改變數據庫狀態的操作。

能在函數中使用的語句有嚴格限制:

不支持create、ALTER、drop等DDL(Data Definition Language)命令。
insert、delete、update只能用在臨時表上。
不支持動態SQL。
不支持“不確定”的函數,比如常用的getdate。不確定函數是指輸入參數相同,返回結果可能不同的函數。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/389207.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/389207.shtml
英文地址,請注明出處:http://en.pswp.cn/news/389207.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

無向圖g的鄰接矩陣一定是_矩陣是圖

無向圖g的鄰接矩陣一定是To study structure,tear away all flesh soonly the bone shows.要研究結構,請盡快撕掉骨頭上所有的肉。 Linear algebra. Graph theory. If you are a data scientist, you have encountered both of these fields in your study or work …

移動pc常用Meta標簽

移動常用 <meta charset"UTF-8"><title>{$configInfos[store_title]}</title><meta content"widthdevice-width,minimum-scale1.0,maximum-scale1.0,shrink-to-fitno,user-scalableno,minimal-ui" name"viewport"><m…

前端繪制繪制圖表_繪制我的文學風景

前端繪制繪制圖表Back when I was a kid, I used to read A LOT of books. Then, over the last couple of years, movies and TV series somehow stole the thunder, and with it, my attention. I did read a few odd books here and there, but not with the same ferocity …

Rapi

本頁內容 ●引言●SMARTPHONE SDK API 庫●管理設備中的目錄文件●取系統信息●遠程操作電話和短信功能 Windows Mobile日益成熟&#xff0c;開發者隊伍也越來越壯大。作為一個10年的計算機熱愛者和程序員&#xff0c;我也經受不住新技術的誘惑&#xff0c;倒騰起Mobile這個玩具…

android 字符串特殊字符轉義

XML轉義字符 以下為XML標志符的數字和字符串轉義符 " ( 或 &quot;) ( 或 &apos;) & ( 或 &amp;) lt(<) (< 或 <) gt(>) (> 或 >) 如題&#xff1a; 比如&#xff1a;在string.xml中定義如下一個字符串&#xff0c;…

如何描繪一個vue的項目_描繪了一個被忽視的幽默來源

如何描繪一個vue的項目Source)來源 ) Data visualization is a great way to celebrate our favorite pieces of art as well as reveal connections and ideas that were previously invisible. More importantly, it’s a fun way to connect things we love — visualizing …

數據存儲加密和傳輸加密_將時間存儲網絡應用于加密預測

數據存儲加密和傳輸加密I’m not going to string you along until the end, dear reader, and say “Didn’t achieve anything groundbreaking but thanks for reading ;)”.親愛的讀者&#xff0c;我不會一直待到最后&#xff0c;然后說&#xff1a; “沒有取得任何開創性的…

熊貓分發_熊貓新手:第一部分

熊貓分發For those just starting out in data science, the Python programming language is a pre-requisite to learning data science so if you aren’t familiar with Python go make yourself familiar and then come back here to start on Pandas.對于剛接觸數據科學的…

多線程 進度條 C# .net

前言  在我們應用程序開發過程中&#xff0c;經常會遇到一些問題&#xff0c;需要使用多線程技術來加以解決。本文就是通過幾個示例程序給大家講解一下多線程相關的一些主要問題。 執行長任務操作  許多種類的應用程序都需要長時間操作&#xff0c;比如&#xff1a;執行一…

window 10 多版本激活工具

window 10 通用版激活工具 云盤地址&#xff1a;https://pan.baidu.com/s/1bo3L4Kn 激活工具網站&#xff1a;http://www.tudoupe.com/win10/win10jihuo/2017/0516/6823.html 轉載于:https://www.cnblogs.com/ipyanthony/p/9288007.html

android 動畫總結筆記 一

終于有時間可以詳細去了解一下 android動畫&#xff0c;先從android動畫基礎著手。在android 3.0之前android動畫api主要是android.view.Animation包下的內容&#xff0c;來先看看這個包里面主要的類![Animation成員](https://img-blog.csdn.net/20150709115201928 "Anima…

《Linux內核原理與分析》第六周作業

課本&#xff1a;第五章 系統調用的三層機制&#xff08;下&#xff09; 中斷向量0x80和system_call中斷服務程序入口的關系 0x80對應著system_call中斷服務程序入口&#xff0c;在start_kernel函數中調用了trap_init函數&#xff0c;trap_init函數中調用了set_system_trap_gat…

使用C#調用外部Ping命令獲取網絡連接情況

使用C#調用外部Ping命令獲取網絡連接情況 以前在玩Windows 98的時候&#xff0c;幾臺電腦連起來&#xff0c;需要測試網絡連接是否正常&#xff0c;經常用的一個命令就是Ping.exe。感覺相當實用。 現在 .net為我們提供了強大的功能來調用外部工具&#xff0c;并通過重定向輸…

Codeforces Round 493

心情不好&#xff0c;被遣散回學校 &#xff0c;心態不好 &#xff0c;為什么會累&#xff0c;一直微笑就好了 #include<bits/stdc.h> using namespace std; int main() {freopen("in","r",stdin);\freopen("out","w",stdout);i…

android動畫筆記二

從android3.0&#xff0c;系統提供了一個新的動畫&#xff0d;property animation, 為什么系統會提供這樣一個全新的動畫包呢&#xff0c;先來看看之前的補間動畫都有什么缺陷吧1、傳統的補間動畫都是固定的編碼&#xff0c;功能是固定的&#xff0c;擴展難度大。比如傳統動畫只…

回歸分析檢驗_回歸分析

回歸分析檢驗Regression analysis is a reliable method in statistics to determine whether a certain variable is influenced by certain other(s). The great thing about regression is also that there could be multiple variables influencing the variable of intere…

是什么樣的騷操作讓應用上線節省90%的時間

優秀的程序員 總會想著 如何把花30分鐘才能解決的問題 在5分鐘內就解決完 例如在應用上線這件事上 通常的做法是 構建項目在本地用maven打包 每次需要clean一次&#xff0c;再build一次 部署包在本地ide、git/svn、maven/gradie 及代碼倉庫、鏡像倉庫和云平臺間 來回切換 上傳部…

QQ API

QQ API設計說明書目錄一、引言 31.1 編寫目的 31.2 更新時間 3二、總體設計 3三、注冊的系統消息 33.1 WM_QQAPI_REGISTER 33.2 WM_QQAPI_REGISTER_RESP 43.3 WM_QQAPI_AVAILABLE 4四、從設備到QQ的自定義事件 54.1 EVENT_QQAPI_SET_AUDIODEVICE …

Ubuntu 18.04 下如何配置mysql 及 配置遠程連接

首先是大家都知道的老三套&#xff0c;啥也不說上來就放三個大招&#xff1a; sudo apt-get install mysql-serversudo apt isntall mysql-clientsudo apt install libmysqlclient-dev 這三步下來mysql就裝好了&#xff0c;然后我們偷偷檢查一下 sudo netstat -tap | grep mysq…