程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> MSSQL >> SQL Function 自界說函數詳解

SQL Function 自界說函數詳解

編輯:MSSQL

SQL Function 自界說函數詳解。本站提示廣大學習愛好者:(SQL Function 自界說函數詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是SQL Function 自界說函數詳解正文


目次

發生配景(曾經有了存儲進程,為何還要應用自界說函數)
成長汗青
組成
應用辦法
實用規模
留意事項
疑問
內容

發生配景(曾經有了存儲進程,為何還要應用自界說函數)

與存儲進程的差別(存在的意義):

1.     可以或許在select等SQL語句中直接應用自界說函數,存儲進程不可。
2.     自界說函數可以挪用其他函數,也能夠挪用本身(遞歸)
3.     可以在表列和 CHECK 束縛中應用自界說函數來完成特別列或束縛
4.       自界說函數不克不及有任何反作用。函數反作用是指對具有函數外感化域(例如數據庫表的修正)的資本狀況的任何永遠性更改。函數中的語句獨一能做的更改是對函數上的部分對象(如部分游標或部分變量)的更改。不克不及在函數中履行的操作包含:對數據庫表的修正,對不在函數上的部分游標停止操作,發送電子郵件,測驗考試修正 目次,和生成前往至用戶的成果集。存儲進程沒有此限制
5.       函數只能前往一個變量。而存儲進程可以前往多個

成長汗青

SqlServer 2000以後都支撐用戶自界說函數

組成

在SQL Server 2000 中依據函數前往值情勢的分歧將用戶自界說函數分為三品種型:標量函數(Scalar Function)、內嵌表值函數(Inline Function)、多聲明表值函數(Multi-Statement Function)
標量函數:標量函數是對單一值操作,前往單一值。可以或許應用表達式的處所,便可以應用標量函數。像我們常常應用的left、getdate等,都屬於標量函數。體系函數中的標量函數包含:數學函數、日期和時光函數、字符串函數、數據類型轉換函數等
內嵌表值函數:內嵌表值函數的功效相當於一個參數化的視圖。它前往的是一個表,內聯表值型函數沒有由BEGIN-END 語句括起來的函數體。其前往的表由一個位於RETURN 子句中的SELECT 敕令段從數據庫中挑選出來。

感化

多聲明表值函數:可以看做標量型和內嵌表值型函數的聯合體。它的前往值是一個表,但它和標量型函數一樣有一個用BEGIN-END 語句括起來的函數體,前往值的表中的數據是由函數體中的語句拔出的。因而可知,它可以停止屢次查詢,對數據停止屢次挑選與歸並,填補了內聯表值型函數的缺乏。

應用辦法

SQL Server 為三品種型的用戶自界說函數 供給了分歧的敕令創立格局。

  (1) 創立標量型用戶自界說函數(Scalar functions) 其語法以下:

各參數解釋以下:
  owner_name :指定用戶自界說函數的一切者。
  function_name:指定用戶自界說函數的稱號。database_name.owner_name.function_name 應是唯一的。
  @parameter_name:界說一個或多個參數的稱號。一個函數最多可以界說1024 個參數每一個參數前用“@”符號標明。參數的感化規模是全部函數。參數只能替換常量,不克不及替換表 名、列名或其它數據庫對象的稱號。用戶自界說函數不支撐輸入參數。 
  scalar_parameter_data_type:指定標量型參數的數據類型,可認為除TEXT、 NTEXT、 IMAGE、 CURSOR、TIMESTAMP 和TABLE 類型外的其它數據類型。 
  scalar_return_data_type:指定標量型前往值的數據類型,可認為除TEXT、 NTEXT、 IMAGE、 CURSOR、TIMESTAMP 和TABLE 類型外的其它數據類型。 
  scalar_expression:指定標量型用戶自界說函數前往的標量值表達式。
  function_body:指定一系列的Transact-SQL 語句,它們決議了函數的前往值。 
  ENCRYPTION:加密選項。讓SQL Server 對體系表中有關CREATE FUNCTION 的聲明加密,以避免用戶自界說函數作為SQL Server 復制的一部門被宣布(Publish) 。
   SCHEMABINDING:籌劃綁定選項將用戶自界說函數綁定到它所援用的數據庫對象假如指定 了此選項,則函數所觸及的數據庫對象從此將不克不及被刪除或修正,除非函數被刪除或去失落此選項。應留意的是,要綁定的數據庫對象必需與函數在統一數據庫中。

(2)創立內聯表值型用戶自界說函 數(Inline Table-valued Functions)

其語法以下:

各參數解釋以下:

  TABLE:指定前往值為一個表。

  select-stmt:單個SELECT 語句,肯定前往的表的數據。

  其他參數與標量型用戶自界說函數雷同。

(3) 創立多聲明表值型用戶自界說函數

  其語法以下:

各參數解釋以下:

  @return_variable :一個TABLE 類型的變量,用於存儲和積累前往的表中的數據行。 其他參數與標量型用戶自界說函數雷同。

  在多聲明表值型用戶自界說函數的函數體中許可應用以下Transact-SQL 語句。 賦值語句(Assignment statements); 流程掌握語句(Control-of-Flow statements); 界說感化規模在函數內的變量和 游標的DECLARE 語句; SELECT 語句; 編纂函數中界說的表變量的INSERT、 UPDATE 和DELETE 語句; 在函數中許可觸及諸如聲明游 標、翻開游標、封閉游標、釋放游標如許的游標操作,關於讀取游標而言,除非在FETCH 語句中應用INTO 從句來對某一變量賦值,不然不許可在函數中應用FETCH 語句來向客戶端前往數據。此 外不肯定性函數(Non-deterministic functions) 不克不及在用戶自界說函數中使 用。所謂不肯定性函數是指那些應用雷同的挪用參數在分歧時辰挪用獲得的前往值分歧的函數。這些函數如表13-3 所示(全局變量也能夠視為一種函數)。

實用規模

1. 只查詢,不修正數據庫的狀況(修正、刪除表中記載等)

2. 成果集須要經由過程遞歸等辦法獲得時,可使用函數,函數比擬靈巧

3. 成果集須要直接被援用時,可使用函數。須要對成果集停止再加工(指放在select語句中等),可使用函數,函數可以嵌在select等sql語句中。

留意事項:

用戶自界說函數不克不及用於履行一系列轉變數據庫狀況的操作

在編寫自界說函數時須要留意的:

關於標量函數:

1. 一切的入參前都必需加@

2. create後的前往,單詞是returns,而不是return

3. returns前面的跟的不是變量,而是前往值的類型,如:int,char等。

4. 在begin/end語句塊中,是return。

內嵌表值函數:

1. 只能前往table,所以returns前面必定是TABLE

2. AS後沒有begin/end,只要一個return語句來前往特定的記載。

多語句表值函數:

1. returns前面直接界說前往的表類型,起首是界說表名,注解後面要加@,然後是症結字TABLE,最初是表的構造。

2. 在begin/end語句塊中,直接將須要前往的成果insert到returns界說的表中便可以了,在最初return時,會將成果前往。

3. 最初只須要return,return前面不跟任何變量。

疑問:自界說函數不克不及修正數據庫,但它可以挪用存儲進程,那末在自界說函數中挪用一個有修正數據庫的操作的存儲進程,這個自界說函數能不克不及履行?

答:自界說函數只能挪用擴大存儲進程,然則SQL Server 2008的後續版本將刪除該功效,不再支撐擴大存儲進程,所以應防止在開辟中應用擴大存儲進程。是以,可以得出結論是:現實開辟中,函數不會去挪用存儲進程,也就沒法對數據庫停止修正操作了。

參考:
http://technet.microsoft.com/zh-tw/library/ms186755.aspx
http://msdn.microsoft.com/zh-cn/library/ms175200.aspx
http://www.cnblogs.com/Athrun/archive/2007/07/27/833416.html

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved