在 Transact-SQL 语句中允许相同数据类型的标量表达式的任何位置,可唤醒调用返回标量值的用户定义函数:
查询
在以下位置允许返回标量值的用户定义函数:
SELECT *, dbo.fn_CalculateDaysLate(RequiredDate) AS DaysLate
FROM Northwind.dbo.Employees
SELECT *
FROM Northwind.dbo.[Order Details]
WHERE UnitPrice < dbo.fn_MeanUnitPrice()
UPDATE Orders
SET ShipVia = dbo.fn_FindLeastCostShipper(ShipCity)
WHERE OrderID = 10274
INSERT INTO Shippers
VALUES (4, dbo.fn_GetShipperName(), n'(503)555-9931'
在这些位置中引用的用户定义函数逻辑上每行执行一次。
CHECK 约束
如果传递给函数的参数值仅引用表中的列或常量,则可以在 CHECK 约束中唤醒调用返回标量值的用户定义函数。查询处理器每次检查约束时,都使用与所检查的当前行相关联的参数值调用函数。表的所有者还必须是由表的 CHECK 约束唤醒调用的用户定义函数的所有者。
DEFAULT 定义
如果传递给函数的参数值仅包含常量,则用户定义函数可作为 DEFAULT 定义的 constant_expression 唤醒调用。表的所有者还必须是由表的 DEFAULT 定义调用的用户定义函数的所有者。
计算列
如果传递给函数的参数值仅引用表中的列或常量,则可由计算列唤醒调用函数。表的所有者还必须是由表的计算列调用的用户定义函数的所有者。
赋值运算符
赋值运算符 (left_operand = right_operand) 可唤醒调用用户定义函数,以便在指定为右操作数的表达式中返回标量值。
控制流语句
布尔表达式中的控制流语句可唤醒调用返回标量值的用户定义函数。
CASE 表达式
在任何 CASE 表达式中可唤醒调用返回标量值的用户定义函数。
PRINT 语句
返回字符串的用户定义函数可作为 PRINT 语句的 string_expr 表达式唤醒调用。
函数和存储过程
可采用与存储过程相同的方式执行返回标量值的用户定义函数。当执行返回标量值的用户定义函数时,指定参数的方式与指定存储过程的方式相同:
以下是返回小数的用户定义函数的定义:
CREATE FUNCTION fn_CubicVolume
-- Input dimensions in centimeters.
(@CubeLength decimal(4,1), @CubeWidth decimal(4,1),
@CubeHeight decimal(4,1) )
RETURNS decimal(12,3) -- Cubic Centimeters.
WITH SCHEMABINDING
AS
BEGIN
RETURN ( @CubeLength * @CubeWidth * @CubeHeight )
END
以下是执行 fn_CubicVolume 函数的示例。使用 Transact-SQL EXECUTE 语句时,参数的标识次序与函数定义中的参数标识次序不同:
DECLARE @MyDecimalVar decimal(12,3)
EXEC @MyDecimalVar = dbo.fn_CubicVolume @CubeLength = 12.3,
@CubeHeight = 4.5, @CubeWidth = 4.5
以下是执行 fn_CubicVolume 函数时不指定参数名的示例:
DECLARE @MyDecimalVar decimal(12,3)
EXEC @MyDecimalVar = dbo.fn_CubicVolume 12.3, 4.5, 4.5
还可使用 ODBC CALL 语法从 OLE DB 或 ODBC 应用程序执行 fn_CubicVolume 函数:
-- First use SQLBindParam to bind the return value parameter marker -- to a program variable of the appropriate type SQLExecDirect(hstmt, "{CALL ? = fn_CubicVolume(12.3, 4.5, 4.5) }",SQL_NTS);