如何在SQL Server上改进用户定义的函数?

如何在SQL Server上改进用户定义的函数?,sql,sql-server,user-defined-functions,Sql,Sql Server,User Defined Functions,我有一个SQL Server 2008 R2 UDF,它执行一种递归循环。我的意思是,我有一个名为Employees的表,在其中的一列中,我存储了另一个雇员id(他的老板) 当我获得员工id时,我必须能够了解他下面的整个部门。例如: 员工乔(身份证号码:1)为罗伯特(身份证号码:2)工作 员工罗伯特(身份证号码:2)为米歇尔(身份证号码:3)工作 我必须能够计算米歇尔以下所有员工的工资(假设在同一张表上),即罗伯特和乔 到目前为止,我创建了一个UDF,它返回一个表,其中所有员工ID都在Miche

我有一个SQL Server 2008 R2 UDF,它执行一种递归循环。我的意思是,我有一个名为Employees的表,在其中的一列中,我存储了另一个雇员id(他的老板)

当我获得员工id时,我必须能够了解他下面的整个部门。例如: 员工乔(身份证号码:1)为罗伯特(身份证号码:2)工作 员工罗伯特(身份证号码:2)为米歇尔(身份证号码:3)工作

我必须能够计算米歇尔以下所有员工的工资(假设在同一张表上),即罗伯特和乔

到目前为止,我创建了一个UDF,它返回一个表,其中所有员工ID都在Michelle下面,并在查询“where”上使用EXISTS子句,但它的性能非常差

你们还有别的想法吗


谢谢大家!

您可能应该使用递归而不是
WHILE
循环来查找所有员工。我没有你的表格或数据,所以我编了一些:

create table Employees (
    ID int not null primary key,
    Name varchar(20) not null,
    BigBossID int null foreign key references Employees(ID),
    Salary decimal(18,4) not null
)
go
insert into Employees (ID,Name,BigBossID,Salary) values
(1,'Joe',2,2.50),
(2,'Robert',3,19000.75),
(3,'Michelle',null,1234567890.00)
然后我可以使用此查询查找以下所有员工:

declare @RootID int
set @RootID = 3
;With EmployeesBelowRoot as (
    select ID from Employees where BigBossID = @RootID
    union all
    select e.ID from Employees e inner join EmployeesBelowRoot ebr on e.BigBossID = ebr.ID
)
select SUM(Salary) from Employees where ID in (select ID from EmployeesBelowRoot)

你可以(如果你认为值得的话)将CTE(
EmployeesBelowRoot
)放入一个UDF中,并用
@RootID
作为参数调用它,但我现在直接把它放在查询中。

忘了说我在UDF上使用while循环来检索每个员工,这在你的情况下并不确定,但是如果您需要层次化数据,那么您应该遵循这一点,而不是使用
WHILE
循环。显式循环很少是实现性能的最佳方式。但无法提供示例,因为您尚未向我们显示任何代码。