sql2k中新增加的Function的sqlbook 的幫助_Mssql數(shù)據(jù)庫(kù)教程
推薦:SQL Server 2005基于消息的應(yīng)用程序介紹基于消息的應(yīng)用程序并不是一個(gè)新概念,一直以來,從頭編寫這樣的應(yīng)用程序都相當(dāng)困難。我將在一系列三篇文章中討論一個(gè)建立異步消息應(yīng)用程序的新平臺(tái),本文為第一篇,我將在其中說明基于消息的應(yīng)
CREATE FUNCTION
創(chuàng)建用戶定義函數(shù),它是返回值的已保存的 Transact-SQL 例程。用戶定義函數(shù)不能用于執(zhí)行一組修改全局?jǐn)?shù)據(jù)庫(kù)狀態(tài)的操作。與系統(tǒng)函數(shù)一樣,用戶定義函數(shù)可以從查詢中喚醒調(diào)用。也可以像存儲(chǔ)過程一樣,通過 EXECUTE 語句執(zhí)行。
用戶定義函數(shù)用 ALTER FUNCTION 修改,用 DROP FUNCTION 除去。
語法
標(biāo)量函數(shù)
| 以下為引用的內(nèi)容: CREATE FUNCTION [ owner_name.] function_name RETURNS scalar_return_data_type [ WITH < function_option> [ [,] ...n] ] [ AS ] BEGIN |
內(nèi)嵌表值函數(shù)
| 以下為引用的內(nèi)容: CREATE FUNCTION [ owner_name.] function_name RETURNS TABLE [ WITH < function_option > [ [,] ...n ] ] [ AS ] RETURN [ ( ] select-stmt [ ) ] |
多語句表值函數(shù)
| 以下為引用的內(nèi)容: CREATE FUNCTION [ owner_name.] function_name RETURNS @return_variable TABLE < table_type_definition > [ WITH < function_option > [ [,] ...n ] ] [ AS ] BEGIN < function_option > ::= < table_type_definition > ::= |
參數(shù)
owner_name
擁有該用戶定義函數(shù)的用戶 ID 的名稱。owner_name 必須是現(xiàn)有的用戶 ID。
function_name
用戶定義函數(shù)的名稱。函數(shù)名稱必須符合標(biāo)識(shí)符的規(guī)則,對(duì)其所有者來說,該名稱在數(shù)據(jù)庫(kù)中必須是唯一的。
@parameter_name
用戶定義函數(shù)的參數(shù)。CREATE FUNCTION 語句中可以聲明一個(gè)或多個(gè)參數(shù)。函數(shù)最多可以有 1,024 個(gè)參數(shù)。函數(shù)執(zhí)行時(shí)每個(gè)已聲明參數(shù)的值必須由用戶指定,除非該參數(shù)的默認(rèn)值已經(jīng)定義。 如果函數(shù)的參數(shù)有默認(rèn)值,在調(diào)用該函數(shù)時(shí)必須指定"default"關(guān)鍵字才能獲得默認(rèn)值。這種行為不同于存儲(chǔ)過程中有默認(rèn)值的參數(shù),在存儲(chǔ)過程中省略參數(shù)也意味著使用默認(rèn)值。
使用 @ 符號(hào)作為第一個(gè)字符來指定參數(shù)名稱。參數(shù)名稱必須符合標(biāo)識(shí)符的規(guī)則。每個(gè)函數(shù)的參數(shù)僅用于該函數(shù)本身;相同的參數(shù)名稱可以用在其它函數(shù)中。參數(shù)只能代替常量;而不能用于代替表名、列名或其它數(shù)據(jù)庫(kù)對(duì)象的名稱。
scalar_parameter_data_type
參數(shù)的數(shù)據(jù)類型。所有標(biāo)量數(shù)據(jù)類型(包括 bigint 和 sql_variant)都可用作用戶定義函數(shù)的參數(shù)。不支持 timestamp 數(shù)據(jù)類型和用戶定義數(shù)據(jù)類型。不能指定非標(biāo)量類型(例如 cursor 和 table)。
scalar_return_data_type
是標(biāo)量用戶定義函數(shù)的返回值。scalar_return_data_type 可以是 SQL Server 支持的任何標(biāo)量數(shù)據(jù)類型(text、ntext、image 和 timestamp 除外)。
scalar_expression
指定標(biāo)量函數(shù)返回的標(biāo)量值。
TABLE
指定表值函數(shù)的返回值為表。
在內(nèi)嵌表值函數(shù)中,通過單個(gè) SELECT 語句定義 TABLE 返回值。內(nèi)嵌函數(shù)沒有相關(guān)聯(lián)的返回變量。
在多語句表值函數(shù)中,@return_variable 是 TABLE 變量,用于存儲(chǔ)和累積應(yīng)作為函數(shù)值返回的行。
function_body
指定一系列 Transact-SQL 語句定義函數(shù)的值,這些語句合在一起不會(huì)產(chǎn)生副作用。function_body 只用于標(biāo)量函數(shù)和多語句表值函數(shù)。
在標(biāo)量函數(shù)中,function_body 是一系列合起來求得標(biāo)量值的 Transact-SQL 語句。
在多語句表值函數(shù)中,function_body 是一系列填充表返回變量的 Transact-SQL 語句。
select-stmt
是定義內(nèi)嵌表值函數(shù)返回值的單個(gè) SELECT 語句。
ENCRYPTION
指出 SQL Server 加密包含 CREATE FUNCTION 語句文本的系統(tǒng)表列。使用 ENCRYPTION 可以避免將函數(shù)作為 SQL Server 復(fù)制的一部分發(fā)布。
SCHEMABINDING
指定將函數(shù)綁定到它所引用的數(shù)據(jù)庫(kù)對(duì)象。如果函數(shù)是用 SCHEMABINDING 選項(xiàng)創(chuàng)建的,則不能更改(使用 ALTER 語句)或除去(使用 DROP 語句)該函數(shù)引用的數(shù)據(jù)庫(kù)對(duì)象。
函數(shù)與其所引用對(duì)象的綁定關(guān)系只有在發(fā)生以下兩種情況之一時(shí)才被解除:
除去了函數(shù)。
在未指定 SCHEMABINDING 選項(xiàng)的情況下更改了函數(shù)(使用 ALTER 語句)。
只有在滿足以下條件時(shí),函數(shù)才能綁定到架構(gòu):
該函數(shù)所引用的用戶定義函數(shù)和視圖也已綁定到架構(gòu)。
該函數(shù)所引用的對(duì)象不是用兩部分名稱引用的。
該函數(shù)及其引用的對(duì)象屬于同一數(shù)據(jù)庫(kù)。
執(zhí)行 CREATE FUNCTION 語句的用戶對(duì)所有該函數(shù)所引用的數(shù)據(jù)庫(kù)對(duì)象都具有 REFERENCES 權(quán)限。
如果不符合以上條件,則指定了 SCHEMABINDING 選項(xiàng)的 CREATE FUNCTION 語句將失敗。
注釋
用戶定義函數(shù)為標(biāo)量值函數(shù)或表值函數(shù)。如果 RETURNS 子句指定一種標(biāo)量數(shù)據(jù)類型,則函數(shù)為標(biāo)量值函數(shù)。可以使用多條 Transact-SQL 語句定義標(biāo)量值函數(shù)。
如果 RETURNS 子句指定 TABLE,則函數(shù)為表值函數(shù)。根據(jù)函數(shù)主體的定義方式,表值函數(shù)可分為行內(nèi)函數(shù)或多語句函數(shù)。
如果 RETURNS 子句指定的 TABLE 不附帶列的列表,則該函數(shù)為行內(nèi)函數(shù)。行內(nèi)函數(shù)是使用單個(gè) SELECT 語句定義的表值函數(shù),該語句組成了函數(shù)的主體。該函數(shù)返回的表的列(包括數(shù)據(jù)類型)來自定義該函數(shù)的 SELECT 語句的 SELECT 列表。
如果 RETURNS 子句指定的 TABLE 類型帶有列及其數(shù)據(jù)類型,則該函數(shù)是多語句表值函數(shù)。
多語句函數(shù)的主體中允許使用以下語句。未在下面的列表中列出的語句不能用在函數(shù)主體中。
賦值語句。
控制流語句。
DECLARE 語句,該語句定義函數(shù)局部的數(shù)據(jù)變量和游標(biāo)。
SELECT 語句,該語句包含帶有表達(dá)式的選擇列表,其中的表達(dá)式將值賦予函數(shù)的局部變量。
游標(biāo)操作,該操作引用在函數(shù)中聲明、打開、關(guān)閉和釋放的局部游標(biāo)。只允許使用以 INTO 子句向局部變量賦值的 FETCH 語句;不允許使用將數(shù)據(jù)返回到客戶端的 FETCH 語句。
INSERT、UPDATE 和 DELETE 語句,這些語句修改函數(shù)的局部 table 變量。
EXECUTE 語句調(diào)用擴(kuò)展存儲(chǔ)過程。
函數(shù)的確定性和副作用
函數(shù)可以是確定的或不確定的。如果任何時(shí)候用一組特定的輸入值調(diào)用函數(shù)時(shí)返回的結(jié)果總是相同的,則這些函數(shù)為確定的。如果每次調(diào)用函數(shù)時(shí)即使用的是相同的一組特定輸入值,返回的結(jié)果總是不同的,則這些函數(shù)為不確定的。
不確定的函數(shù)會(huì)產(chǎn)生副作用。副作用是更改數(shù)據(jù)庫(kù)的某些全局狀態(tài),比如更新數(shù)據(jù)庫(kù)表或某些外部資源,如文件或網(wǎng)絡(luò)等(例如,修改文件或發(fā)送電子郵件消息)。
不允許在用戶定義函數(shù)主體中內(nèi)置不確定函數(shù);這些不確定函數(shù)如下:
| 以下為引用的內(nèi)容: @@CONNECTIONS @@TOTAL_ERRORS @@CPU_BUSY @@TOTAL_READ @@IDLE @@TOTAL_WRITE @@IO_BUSY GETDATE @@MAX_CONNECTIONS GETUTCDATE @@PACK_RECEIVED NEWID @@PACK_SENT RAND @@PACKET_ERRORS TEXTPTR @@TIMETICKS |
盡管在用戶定義函數(shù)主體中不允許有不確定函數(shù),這些用戶定義函數(shù)在調(diào)用擴(kuò)展存儲(chǔ)過程時(shí)仍會(huì)產(chǎn)生副作用。
由于擴(kuò)展存儲(chǔ)過程會(huì)對(duì)數(shù)據(jù)庫(kù)產(chǎn)生副作用,因此調(diào)用擴(kuò)展存儲(chǔ)過程的函數(shù)是不確定的。當(dāng)用戶定義函數(shù)調(diào)用會(huì)對(duì)數(shù)據(jù)庫(kù)產(chǎn)生副作用的擴(kuò)展存儲(chǔ)過程時(shí),不要指望結(jié)果集保持一致或執(zhí)行函數(shù)。
從函數(shù)中調(diào)用擴(kuò)展存儲(chǔ)過程
從函數(shù)內(nèi)部調(diào)用時(shí)擴(kuò)展存儲(chǔ)過程無法向客戶端返回結(jié)果集。任何向客戶端返回結(jié)果集的 ODS API 都將返回 FAIL。擴(kuò)展存儲(chǔ)過程可以連接回 Microsoft? SQL Server?;但是,它不應(yīng)嘗試聯(lián)接與喚醒調(diào)用擴(kuò)展存儲(chǔ)過程的函數(shù)相同的事務(wù)。
與從批處理或存儲(chǔ)過程中喚醒調(diào)用相似,擴(kuò)展存儲(chǔ)過程在運(yùn)行 SQL Server 的 Windows? 安全帳戶的上下文中執(zhí)行。存儲(chǔ)過程的所有者在授予用戶 EXECUTE 特權(quán)時(shí)應(yīng)考慮這一點(diǎn)。
函數(shù)調(diào)用
在可使用標(biāo)量表達(dá)式的位置可喚醒調(diào)用標(biāo)量值函數(shù),包括計(jì)算列和 CHECK 約束定義。當(dāng)喚醒調(diào)用標(biāo)量值函數(shù)時(shí),至少應(yīng)使用函數(shù)的兩部分名稱。
[database_name.]owner_name.function_name ([argument_expr][,...])
如果用戶定義函數(shù)用于定義計(jì)算列,則該函數(shù)的確定性同樣決定了是否可在該計(jì)算列上創(chuàng)建索引。只有當(dāng)函數(shù)具有確定性時(shí),才可以在使用該函數(shù)的計(jì)算列上創(chuàng)建索引。如果在輸入相同的情況下函數(shù)始終返回相同的值,則該函數(shù)具有確定性。
可以使用由一部分組成的名稱喚醒調(diào)用表值函數(shù)。
[database_name.][owner_name.]function_name ([argument_expr][,...])
對(duì)于 Microsoft? SQL Server? 2000 中包含的系統(tǒng)表函數(shù),喚醒調(diào)用時(shí)需在函數(shù)名的前面加上前綴"::"。
| 以下為引用的內(nèi)容: SELECT * FROM ::fn_helpcollations() |
對(duì)于導(dǎo)致語句停止執(zhí)行然后從存儲(chǔ)過程中的下一語句繼續(xù)執(zhí)行的 Transact-SQL 錯(cuò)誤,在函數(shù)中的處理方式不同。在函數(shù)中,這類錯(cuò)誤會(huì)導(dǎo)致函數(shù)停止執(zhí)行。這反過來使喚醒調(diào)用該函數(shù)的語句停止執(zhí)行。
權(quán)限
用戶應(yīng)具有執(zhí)行 CREATE FUNCTION 語句的 CREATE FUNCTION 權(quán)限。
CREATE FUNCTION 的權(quán)限默認(rèn)地授予 sysadmin 固定服務(wù)器角色和 db_owner 和 db_ddladmin 固定數(shù)據(jù)庫(kù)角色的成員。
sysadmin 和 db_owner 的成員可用 GRANT 語句將 CREATE FUNCTION 權(quán)限授予其它登錄。
函數(shù)的所有者對(duì)其函數(shù)具有 EXECUTE 權(quán)限。其他用戶不具有 EXECUTE 權(quán)限,除非給他們授予了特定函數(shù)上的 EXECUTE 權(quán)限。
若要?jiǎng)?chuàng)建或更改在 CONSTRAINT、DEFAULT 子句或計(jì)算列定義中引用了用戶定義函數(shù)的表,用戶還必須對(duì)這些函數(shù)有 REFERENCES 權(quán)限。
示例
A. 計(jì)算 ISO 周的標(biāo)量值用戶定義函數(shù)
下例中,用戶定義函數(shù) ISOweek 取日期參數(shù)并計(jì)算 ISO 周數(shù)。為了正確計(jì)算該函數(shù),必須在調(diào)用該函數(shù)前喚醒調(diào)用 SET DATEFIRST 1。
| 以下為引用的內(nèi)容: CREATE FUNCTION ISOweek (@DATE datetime) RETURNS int AS BEGIN DECLARE @ISOweek int SET @ISOweek= DATEPART(wk,@DATE) 1 -DATEPART(wk,CAST(DATEPART(yy,@DATE) as CHAR(4)) '0104') --Special cases: Jan 1-3 may belong to the previous year IF (@ISOweek=0) SET @ISOweek=dbo.ISOweek(CAST(DATEPART(yy,@DATE)-1 AS CHAR(4)) '12' CAST(24 DATEPART(DAY,@DATE) AS CHAR(2))) 1 --Special case: Dec 29-31 may belong to the next year IF ((DATEPART(mm,@DATE)=12) AND ((DATEPART(dd,@DATE)-DATEPART(dw,@DATE))>= 28)) SET @ISOweek=1 RETURN(@ISOweek) END |
下面是函數(shù)調(diào)用。注意 DATEFIRST 設(shè)置為 1。
| 以下為引用的內(nèi)容: SET DATEFIRST 1 SELECT master.dbo.ISOweek('12/26/1999') AS 'ISO Week' |
下面是結(jié)果集。
| 以下為引用的內(nèi)容: ISO Week ---------------- 52 |
B. 內(nèi)嵌表值函數(shù)
下例返回內(nèi)嵌表值函數(shù)。
| 以下為引用的內(nèi)容: USE pubs GO CREATE FUNCTION SalesByStore (@storeid varchar(30)) RETURNS TABLE AS RETURN (SELECT title, qty FROM sales s, titles t WHERE s.stor_id = @storeid and t.title_id = s.title_id) |
C. 多語句表值函數(shù)
假設(shè)有一個(gè)表代表如下的層次關(guān)系:
| 以下為引用的內(nèi)容: CREATE TABLE employees (empid nchar(5) PRIMARY KEY, empname nvarchar(50), mgrid nchar(5) REFERENCES employees(empid), title nvarchar(30) ) |
表值函數(shù) fn_FindReports(InEmpID) 有一個(gè)給定的職員ID,它返回與所有直接或間接向給定職員報(bào)告的職員相對(duì)應(yīng)的表。
該邏輯無法在單個(gè)查詢中表現(xiàn)出來,不過可以實(shí)現(xiàn)為用戶定義函數(shù)。
| 以下為引用的內(nèi)容: CREATE FUNCTION fn_FindReports (@InEmpId nchar(5)) -- copy to the result of the function the required columns -- Example invocation |
分享:逐行掃描 為你講解幾個(gè)基本SQLPLUS命令本文章幫你充分認(rèn)識(shí)SQLPLUS命令。 remark:告訴SQLPLUS接下來的文字是注釋,不是命令。 set haedsep:標(biāo)題分隔符標(biāo)識(shí)一個(gè)告訴SQLPLUS將一個(gè)標(biāo)題分為兩行或更多行的字符。 ttitle:設(shè)置報(bào)
- sql 語句練習(xí)與答案
- 深入C++ string.find()函數(shù)的用法總結(jié)
- SQL Server中刪除重復(fù)數(shù)據(jù)的幾個(gè)方法
- sql刪除重復(fù)數(shù)據(jù)的詳細(xì)方法
- SQL SERVER 2000安裝教程圖文詳解
- 使用sql server management studio 2008 無法查看數(shù)據(jù)庫(kù),提示 無法為該請(qǐng)求檢索數(shù)據(jù) 錯(cuò)誤916解決方法
- SQLServer日志清空語句(sql2000,sql2005,sql2008)
- Sql Server 2008完全卸載方法(其他版本類似)
- sql server 2008 不允許保存更改,您所做的更改要求刪除并重新創(chuàng)建以下表
- SQL Server 2008 清空刪除日志文件(瞬間日志變幾M)
- Win7系統(tǒng)安裝MySQL5.5.21圖解教程
- 將DataTable作為存儲(chǔ)過程參數(shù)的用法實(shí)例詳解
Mssql數(shù)據(jù)庫(kù)教程Rss訂閱編程教程搜索
Mssql數(shù)據(jù)庫(kù)教程推薦
- 解讀SQL Server與Access語法小差異
- 教你一招:MSSQL數(shù)據(jù)庫(kù)索引的應(yīng)用
- 實(shí)現(xiàn)刪除主表數(shù)據(jù)時(shí), 判斷與之關(guān)聯(lián)的外鍵表是否有數(shù)據(jù)
- 怎樣通過SQLyog分析MySQL數(shù)據(jù)庫(kù)
- 解析MySQL實(shí)現(xiàn)SQL Server的sp_executesql
- 兩條經(jīng)典SQL語句
- 解析SQL Server的怪辟:異常與孤立事務(wù)
- 修改SQL Server2005的sa用戶密碼
- sql server 2008中的apply運(yùn)算符使用方法
- 解析SQL Server索引管理的六大鐵律
猜你也喜歡看這些
- Ubuntu下取消MySQL數(shù)據(jù)庫(kù)本機(jī)綁定限制方法
- MySQL筆記之?dāng)?shù)據(jù)備份與還原的使用詳解
- mysql常用設(shè)置:字符集編碼、自動(dòng)完成(自動(dòng)提示)、監(jiān)聽外網(wǎng)ip
- MySQL前綴索引導(dǎo)致的慢查詢分析總結(jié)
- 如何通過SQL找出2個(gè)表里值不同的列的方法
- CentOS6.4系統(tǒng)中Mysql數(shù)據(jù)庫(kù)卸載、安裝與配置
- MySQL 替換某字段內(nèi)部分內(nèi)容的UPDATE語句
- mysql占用CPU過高的解決辦法(添加索引)
- MySQL性能優(yōu)化的最佳21條經(jīng)驗(yàn)
- 解析csv數(shù)據(jù)導(dǎo)入mysql的方法
- 相關(guān)鏈接:
- 教程說明:
Mssql數(shù)據(jù)庫(kù)教程-sql2k中新增加的Function的sqlbook 的幫助
。