除了使用系統提供的函式外,使用者還可以根據需要自定義函式。使用者自定義函式(user defined functions)是sql server 2000 新增的資料庫物件,是sql server 的一大改進。
使用者自定義函式不能用於執行一系列改變資料庫狀態的操作,但它可以像系統函式一樣在查詢或儲存過程等的程式段中使用,也可以像儲存過程一樣通過execute 命令來執行。使用者自定義函式中儲存了乙個transact-sql 例程,可以返回一定的值。
在sql server 2000 中根據函式返回值形式的不同將使用者自定義函式分為三種型別: 標量型函式(scalar functions)
標量型函式返回乙個確定型別的標量值其返回值型別為除text、 ntext、 image、cursor、 timestamp 和table 型別外的其它資料型別。函式體語句定義在begin-end語句內,其中包含了可以返回值的transact-sql 命令。 內聯錶值型函式(inline table-valued functions)
內聯錶值型函式以表的形式返回乙個返回值,即它返回的是乙個表內聯錶值型函式沒有由begin-end 語句括起來的函式體。其返回的表由乙個位於return 子句中的select 命令段從資料庫中篩選出來。內聯錶值型函式功能相當於乙個引數化的檢視。 多宣告錶值型函式(multi-statement table-valued functions)
多宣告錶值型函式可以看作標量型和內聯錶值型函式的結合體。它的返回值是乙個表,但它和標量型函式一樣有乙個用begin-end 語句括起來的函式體,返回值的表中的資料是由函式體中的語句插入的。由此可見,它可以進行多次查詢,對資料進行多次篩選
與合併,彌補了內聯錶值型函式的不足。
13.13.1 建立使用者自定義函式
sql server 2000 為三種型別的使用者自定義函式提供了不同的命令建立格式。
(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
計畫繫結選項將使用者自定義函式繫結到它所引用的資料庫物件如果指定了此選項,則函式所涉及的資料庫物件從此將不能被刪除或修改,除非函式被刪除或去掉此選項。應注意的是,要繫結的資料庫物件必須與函式在同一資料庫中。
其語法如下:
各引數說明如下: 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 所示(全域性變數也可以視為一種函式)。
(4) 用enterprise manager 建立使用者自定義函式
用enterprise manager 建立使用者自定義函式的方法是:在enterprise manager 中選擇要建立使用者自定義函式的資料庫。在資料庫物件「user defined functions」 上單擊右鍵,從開始選單中選擇「new user defined function」 選項,就會出現如圖13-4 所示的定義使用者自定義函式屬性對話方塊。可以在其中指定要定義的函式的名稱,並編輯函式的指令碼。單擊「ok」按鈕,則新增使用者自定義函式物件到資料庫中。
圖13-4 定義使用者自定義函式屬性對話方塊
13.13.2 修改和刪除使用者自定義函式
在enterprise manager 中選擇要進行改動的使用者自定義函式,單擊右鍵從快捷選單中選擇「屬性」選項,則會出現與圖13-4 類似的修改使用者自定義函式結構對話方塊。可以修改使用者自定義函式的函式體、引數等。從快捷選單中選擇「刪除」選項,則可刪除使用者自定義函式。
用alter function 命令也可以修改使用者自定義函式。此命令的語法與createfunction 相同,因此使用alter function 命令其實相當於重建了乙個同名的函式,用起來不大方便。
另外,可以用drop function 命令刪除使用者自定義函式,其語法如下:
drop function [ ,...n ]
例13-22: 刪除使用者自定義函式chiefinfo
drop function chiefinfo
本章小結
本章主要介紹了sql server 中極為重要的兩個概念:游標和檢視,游標最為突出的貢獻在於其實現了對結果的行操作,從而可以在應用程式中對同一結果集施加不同的資料操作,在面向集合的資料庫管理系統和面向行的程式設計兩者之間架起了「溝通」的橋梁,實現了兩個資料處理方式的自由交流。檢視作為乙個查詢結果集雖然仍與表具有相似的結構,但它是一張虛表,以檢視結構顯示在使用者面前的資料並不是以檢視的結構儲存在資料庫中,而是儲存在檢視所引用的基本表當中。檢視的存在為保障資料庫的安全性提供了新手段。除此之外,讀者從本章中也可以了解到sql server 2000 新增的「使用者自定義函式」的建立和使用。
自定義實現strcmp,atoi,itoa函式
1.mystrcmp函式,字串比較 abc x abc abc ab aa 第乙個大於第二個則返回正數,相等返回0,第乙個小於第二個返回負數。include include intmystrcmp const char str1,const char str2 int tmp 0 while tmp...
MSSQL 自定義分割函式
由於要寫乙個加班程式 需要處理到的乙個問題就是批量插入 listbox的專案插入到資料庫 方法一 迴圈呼叫儲存過程 方法二 一次性傳入引數到儲存過程,儲存過程中游標處理 方法二的方案效率比較高 但需要解決的乙個問題是 如何分割函式 多層分隔函式 工號1 名字1,工號2 名字2,實現迴圈插入資料庫 分...
MS SQL自定義函式IsNumeric
判斷字串是否為純數字,負數不算。如 00012 54585 1000 函式返bit資料型別,是數字返回1,非數字返回0。asbegin declare rtv bit 1declare str nvarchar max ltrim rtrim isnull string,去除前後空格,如果為null...