标量函数对一个或多个参数进行操作以产生一个单独的值。定义函数时,参数必须放置在括号中间。标量函数可以返回除了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;