在应用数据库开发中经常遇到这样一个问题:一个实体的属性包含另一个实体的属性,比如OA中的用户实体,包含职位实体的职位Id,并且一个用户有可能身兼多职。在数据库存储中一般用“PrivId1,PrivId2,PriveId3,...,...,”的方式来存储。但我们的程序中获取数据的时候一般想获得职位名称。而这种方式在获取数据的时候,按照一般的思维就是,想获取用户的职位Id,在通过职位的Id再去获取职位名称,应用起来特别别扭。今天在应用到函数max()是突然想到,是不是可以创建一个用户自定义函数来解决数据提取的别扭问题。函数代码如下:
set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go ------------------------------------------------------------------------------------------------------------------------ -- 功能:返回部门名称字符串,以,分隔。 ------------------------------------------------------------------------------------------------------------------------ ALTER FUNCTION [dbo].[GetDeptNames] (@DeptIdStr nvarchar(2000)) RETURNS nvarchar(4000) AS BEGIN IF @DeptIdStr IS NULL RETURN '' DECLARE @DeptNameStr nvarchar(4000) DECLARE @DeptName nvarchar(50) DECLARE @i int SET @i = 0 --全部部门 IF UPPER(@DeptIdStr) = 'All_DEPT' RETURN '全体部门' ELSE DECLARE Dept_Cursor CURSOR FOR SELECT [DepartmentName] FROM [dbo].[Department] WHERE CHARINDEX(',' + CAST(DepartmentId AS nvarchar(20)) + ',',',' + @DeptIdStr + ',') > 0 ORDER BY [Department].[DepartmentId] ASC OPEN Dept_Cursor FETCH NEXT FROM Dept_Cursor INTO @DeptName WHILE @@FETCH_STATUS = 0 BEGIN IF @i = 0 SET @DeptNameStr = @DeptName ELSE SET @DeptNameStr = @DeptNameStr + ',' + @DeptName SET @i = @i + 1 FETCH NEXT FROM Dept_Cursor INTO @DeptName END CLOSE Dept_Cursor DEALLOCATE Dept_Cursor RETURN @DeptNameStr END --测试 select * ,dbo.GetDeptNames(DepartmentId) from Users
测试结果跟想要的结果一样。特记录于此,欢迎各位指教