SQL - 标量函数

 

标量函数对一个或多个参数进行操作以产生一个单独的值。定义函数时,参数必须放置在括号中间。标量函数可以返回除了text、ntext、cursor和timestamp的任何数据类型。如果函数语句不止一条,必须使用BEGIN和END。

标量函数可以用于许多位置,包括:

SELECT语句

列的列表

WHERE子句

ORDER BY

GROUP BY

UPDATE语句的SET子句

INSERT语句

CHECK约束

DEFAULT约束

计算列

流控制语句

函数和存储过程内

下面的例子是标量用户定义的函数,返回给定日期的季度和年份:

USE AdventureWorks2008;  

GO  

CREATE FUNCTION dbo.Qtr  

 (@InDate datetime)   

RETURNS char(9)  

AS  

BEGIN   

  RETURN 'FY' + CAST(YEAR(@InDate) As varchar) +  

  '-Q' + CAST(DATEPART(qq, @InDate) AS varchar);  

END  

GO 

这个函数以一种通常用于报表的方式格式化了返回值。日期格式将被转化,以便财政2008年第一季度的日期显示为FY2008-Q1。在PRINT语句中使用函数的例子如下所示:

PRINT dbo.Qtr('3/20/2008'); 

标量函数可以在允许标量表达式的任何地方使用。例如,下面的查询将使用函数来显示数据和,按季度:

SELECT dbo.Qtr(OrderDate) As OrderQuarter,   

  SUM(TotalDue) As TotalSales   

FROM Sales.SalesOrderHeader   

GROUP BY dbo.Qtr(OrderDate)  

ORDER BY dbo.Qtr(OrderDate); 

标量用户定义的函数不止是能够格式化日期。任何不修改数据的Transact-SQL语句集都可以用来计算标量值然后返回。

下面的函数是AdventureWorks2008数据库中的一个例子。它用来计算给定产品的存货总量。

USE AdventureWorks2008;  

GO  

CREATE FUNCTION dbo.ufnGetTotalInventoryStock   

(@ProductID int)  

RETURNS int  

AS  

BEGIN  

 DECLARE @ret int;   

SELECT @ret = SUM(p.Quantity)   

FROM Production.ProductInventory p  

 WHERE p.ProductID = @ProductID;  

 IF (@ret IS NULL)    

SET @ret = 0;  

 RETURN @ret;  

END; 

下面这个例子是使用上面这个函数:

SELECT ProductNumber, Name,   

  dbo.ufnGetTotalInventoryStock(ProductID) As InventoryCount  

FROM Production.Product  

WHERE ProductNumber LIKE 'EC%' 

之前的函数在查询返回的每一行都要执行。这个函数也可以在过程中与流控制语句一起使用,例如:

IF dbo.ufnGetTotalInventoryStock(@ProductID) < 500 

BEGIN   

-- Perform an operation related to low product stock  

END; 

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值