SqlServer2008实例58UDF之维护可重用的代码

    标量UDF可以把逻辑封装到一个函数中,而不是在每次需要的时候多次重复逻辑,从而减少代码膨胀。
    例如,下面的标量用户定义函数用于决定雇员可以拿到的电脑类型。有好几行代码来计算不同的输入参数,包括雇员的头衔、雇员的雇用日期以及是否领薪水.可以将这些逻辑封装到一个函数中,而不是在数据库中的多个地方重复这段逻辑:

USE AdventureWorks
GO

CREATE FUNCTION dbo.udf_GET_AssignedEquipment
(@Title nvarchar(50),@HireDate datetime,@SalariedFlag bit)
RETURNS nvarchar(50)
AS
BEGIN
	DECLARE @EquipmentType nvarchar(50)
	IF @Title LIKE 'Chief%' OR
	   @Title LIKE 'Vice%' OR
	   @Title='Database Administrator'
	BEGIN
		SET @EquipmentType='PC Build A'
	END

	IF @EquipmentType IS NULL AND @SalariedFlag=1
	BEGIN
		SET @EquipmentType='PC Build B'
	END	

	IF @EquipmentType IS NULL AND @HireDate<'1/1/2002'
	BEGIN
		SET @EquipmentType='PC Build C'
	END

	IF @EquipmentType IS NULL
	BEGIN
		SET @EquipmentType='PC Build D'
	END

	RETURN @EquipmentType
END

GO

   可以在T-SQL代码中的很多地方使用这个标量函数,而不需要重新编码这些逻辑。

  示例1,在查询的SELECT、GROUP BY和ORDER BY子句中使用新的标量函数;

USE AdventureWorks
GO

SELECT dbo.udf_GET_AssignedEquipment
	(Title,HireDate,SalariedFlag) PC_Build,
	COUNT(*) Employee_COUNT
FROM HumanResources.Employee
GROUP BY dbo.udf_GET_AssignedEquipment
	(Title,HireDate,SalariedFlag) 	
ORDER BY dbo.udf_GET_AssignedEquipment
	(Title,HireDate,SalariedFlag)	

示例2:在SELECT和WHERE子句中使用这个标量函数:

USE AdventureWorks
GO

SELECT Title,ContactID,
	   dbo.udf_GET_AssignedEquipment
		(Title,HireDate,SalariedFlag) PC_Build
FROM HumanResources.Employee
WHERE dbo.udf_GET_AssignedEquipment
		(Title,HireDate,SalariedFlag) 
	  IN ('PC Build A','PC Build B')

    标量用户定义函数能帮助封装业务逻辑,这样就不需要在代码测重复,提供了集中的地方,使得要修改的时候只需要对一个函数修改就可以了。这还提供了一致性,你和其他数据库开发者能一直以相同方式使用和编写相同的逻辑.此外,还有一个优势就是代码可读性,特别是对于执行多个查找或计算的大型查询。
 

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页