亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

SQL Server 2005------函數(shù)

系統(tǒng) 1812 0
原文: SQL Server 2005------函數(shù)

SQL Server 2005支持用戶自定義函數(shù)和內(nèi)置系統(tǒng)函數(shù),根據(jù)返回值類型又分為標量函數(shù)和表值函數(shù)。

1.標量函數(shù)
標量函數(shù):返回單個數(shù)據(jù)值,返回類型可以是除 text、ntext、image、cursor 和 timestamp 外的任何數(shù)據(jù)類型。
標量函數(shù):分為內(nèi)聯(lián)標量函數(shù)和多語句標量函數(shù)。
內(nèi)聯(lián)標量函數(shù):沒有函數(shù)體,標量值是單個語句的結(jié)果。
多語句標量函數(shù):定義在 BEGIN...END 塊中的函數(shù)體包含一系列返回單個值的 Transact-SQL 語句。
多語句標量函數(shù)范例:
????? CREATE FUNCTION dbo.ufnGetInventoryStock(@ProductID int)
????? RETURNS int
????? AS
????? BEGIN
???????? DECLARE @ret int;
???????? SELECT @ret = SUM(p.Quantity)
???????? FROM Production.ProductInventory p
???????? WHERE p.ProductID = @ProductID
?????????????? AND p.LocationID = '6';
???????? IF (@ret IS NULL)
??????????? SET @ret = 0;
???????? RETURN @ret;
????? END;

2.標值函數(shù)
表值函數(shù):返回 table 數(shù)據(jù)類型,分為內(nèi)聯(lián)表值函數(shù)和多語句表值函數(shù)。
內(nèi)聯(lián)表值函數(shù):沒有函數(shù)主體。
區(qū)別:如果 RETURNS 子句指定的 TABLE 不附帶列的列表,則該函數(shù)為內(nèi)嵌表值函數(shù)。
????? 如果 RETURNS 子句指定的 TABLE 類型帶有列及其數(shù)據(jù)類型,則該函數(shù)是多語句表值函數(shù)。
內(nèi)聯(lián)表值函數(shù)范例:
????? CREATE FUNCTION Sales.ufn_SalesByStore (@storeid int)
????? RETURNS TABLE
????? AS
???????? RETURN
???????? (
?????????? SELECT P.ProductID, P.Name, SUM(SD.LineTotal) AS 'YTD Total'
?????????? FROM Production.Product AS P
?????????? JOIN Sales.SalesOrderDetail AS SD ON SD.ProductID = P.ProductID
?????????? JOIN Sales.SalesOrderHeader AS SH ON SH.SalesOrderID = SD.SalesOrderID
?????????? WHERE SH.CustomerID = @storeid
?????????? GROUP BY P.ProductID, P.Name
????????? );
多語句表值函數(shù):在 BEGIN...END 語句塊中定義的函數(shù)體包含一系列 Transact-SQL 語句,這些語句可生成行并將其插入將返回的表中。
多語句表值函數(shù)范例:
CREATE FUNCTION dbo.ufn_FindReports (@InEmpID INTEGER)
RETURNS @retFindReports TABLE
(
??? EmployeeID int primary key NOT NULL,
??? Name nvarchar(255) NOT NULL,
??? Title nvarchar(50) NOT NULL,
??? EmployeeLevel int NOT NULL,
??? Sort nvarchar (255) NOT NULL
)
--Returns a result set that lists all the employees who report to the
--specific employee directly or indirectly.*/
AS
BEGIN
?? WITH DirectReports(Name, Title, EmployeeID, EmployeeLevel, Sort) AS
??? (SELECT CONVERT(Varchar(255), c.FirstName + ' ' + c.LastName),
??????? e.Title,
??????? e.EmployeeID,
??????? 1,
??????? CONVERT(Varchar(255), c.FirstName + ' ' + c.LastName)
???? FROM HumanResources.Employee AS e
????????? JOIN Person.Contact AS c ON e.ContactID = c.ContactID
???? WHERE e.EmployeeID = @InEmpID
?? UNION ALL
???? SELECT CONVERT(Varchar(255), REPLICATE ('| ' , EmployeeLevel) +
??????? c.FirstName + ' ' + c.LastName),
??????? e.Title,
??????? e.EmployeeID,
??????? EmployeeLevel + 1,
??????? CONVERT (Varchar(255), RTRIM(Sort) + '| ' + FirstName + ' ' +
???????????????? LastName)
???? FROM HumanResources.Employee as e
????????? JOIN Person.Contact AS c ON e.ContactID = c.ContactID
????????? JOIN DirectReports AS d ON e.ManagerID = d.EmployeeID
??? )
-- copy the required columns to the result of the function
?? INSERT @retFindReports
?? SELECT EmployeeID, Name, Title, EmployeeLevel, Sort
?? FROM DirectReports
?? RETURN
END;
GO
-- Example invocation
SELECT EmployeeID, Name, Title, EmployeeLevel
FROM dbo.ufn_FindReports(109)
ORDER BY Sort;

多語句表值函數(shù)中只允許使用下面的語句類型:
???? 賦值語句。
???? 控制流語句。
???? DECLARE 語句,該語句定義函數(shù)局部的數(shù)據(jù)變量和游標。
???? SELECT 語句,該語句包含帶有表達式的選擇列表,其中的表達式將值賦予函數(shù)的局部變量。
???? 游標操作,該操作引用在函數(shù)中聲明、打開、關(guān)閉和釋放的局部游標。只允許使用以 INTO 子句向局部變量賦值的 FETCH 語句;不允許使用將數(shù)據(jù)返回到客戶端的 FETCH 語句。
???? INSERT、UPDATE 和 DELETE 語句,這些語句修改函數(shù)的局部 table 變量。
???? EXECUTE 語句調(diào)用擴展存儲過程。

3.內(nèi)置函數(shù)
?? SQL Server 提供了內(nèi)置函數(shù)幫助您執(zhí)行各種操作。這些函數(shù)不能修改。可以在 Transact-SQL 語句中使用內(nèi)置函數(shù),完成以下操作:
????? 從 SQL Server 系統(tǒng)表中訪問信息而不直接訪問系統(tǒng)表。有關(guān)詳細信息,請參閱使用系統(tǒng)函數(shù)。
????? 執(zhí)行常見任務(wù),例如 SUM、GETDATE 或 IDENTITY。有關(guān)詳細信息,請參閱Functions (Transact-SQL)。
?? 內(nèi)置函數(shù)返回標量數(shù)據(jù)類型或 table 數(shù)據(jù)類型。例如,如果成功執(zhí)行了最后一條 Transact-SQL 語句,@@ERROR 將返回 0。如果該語句生成錯誤,則 @@ERROR 將返回錯誤號。而函數(shù) SUM(parameter) 將返回參數(shù)的所有值的和。?????

4.函數(shù)與存儲過程的區(qū)別
??? 函數(shù)不能用于執(zhí)行一系列改變物理數(shù)據(jù)庫狀態(tài)的操作。BEGIN...END 塊中的語句不能有任何副作用。函數(shù)副作用是指對具有函數(shù)外作用域(例如數(shù)據(jù)庫表的修改)的資源狀態(tài)的任何永久性更改。函數(shù)中的語句唯一能做的更改是對函數(shù)上的局部對象(如局部游標或局部變量)的更改。不能在函數(shù)中執(zhí)行的操作包括:對數(shù)據(jù)庫表的修改,對不在函數(shù)上的局部游標進行操作,發(fā)送電子郵件,嘗試修改目錄,以及生成返回至用戶的結(jié)果集。

5.用戶定義函數(shù)中不允許使用會對每個調(diào)用返回不同數(shù)據(jù)的內(nèi)置函數(shù),用戶定義函數(shù)中不允許使用以下內(nèi)置函數(shù):
???????? @@CONNECTIONS @@PACK_SENT GETDATE
???????? @@CPU_BUSY @@PACKET_ERRORS GetUTCDate
???????? @@IDLE @@TIMETICKS NEWID
???????? @@IO_BUSY @@TOTAL_ERRORS RAND
???????? @@MAX_CONNECTIONS @@TOTAL_READ TEXTPTR
???????? @@PACK_RECEIVED @@TOTAL_WRITE

SQL Server 2005------函數(shù)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 欧美专区在线观看 | 久久亚洲精品一区成人 | 中文字幕欧美日韩久久 | 中文字幕免费在线观看 | 天天操夜夜摸 | 日韩欧美伊人久久大香线蕉 | 国产福利在线 | 国产高清成人mv在线观看 | 成人国产精品一区二区网站 | 视频国产精品 | 欧美国产影院 | 香蕉成人在线 | 很黄的网站在线观看 | 欧美成人伊人十综合色 | 亚洲国产一区二区三区综合片 | 91国在线视频 | dyav午夜片 | 好吊顶色 | 欧美日韩91 | 国产成人在线视频网站 | 欧美刺激午夜性久久久久久久 | 久青草网站| 亚洲精品国产v片在线观看 亚洲精品国产啊女成拍色拍 | 国产精品一区在线麻豆 | 456性欧美欧美在线视频 | 色视频播放 | 精品福利一区 | 久久99久久99精品免观看动漫 | 精品国产第一国产综合精品 | 久草热久| 色婷婷综合欧美成人 | 两个人高清视频图片中文字幕 | 一级特级aaaa毛片免费观看 | 日本成人一区二区三区 | 精品玖玖玖视频在线观看 | 99视频免费播放 | 国产成人一区二区三中文 | 久久久久夜| 午夜国产精品福利在线观看 | 亚洲好视频 | 国产精品久久精品福利网站 |