我如何在没有游标的情况下重做这个UDF来加速整个sql?
我们有一个庞大而复杂的sql,可以让所有患者获得有效的订单, 并且对于每个订单(记录),调用udf来获取该订单的所有AdminTimes,现在我无法消除UDF调用,因为它确实已经为每个订单单独调用 但至少在udf中生成AdminTimes应尽可能加快,目前服务器cpu变得非常高,等待和锁定在用户运行此报告时累积
UDF从ReordersAdminTimes表获取特定RoNo,Split组合的所有AdminTimes
这是UDF,它使用游标连接到一个字符串所有命令管理时间
CREATE function dbo.GetAllReorderAdminTimes(
@FacID nvarchar(6),
@PatID nvarchar(11),
@RoNo int,
@Split int
) returns nvarchar(256)
as
begin
declare @times nvarchar(256)
set @times = ''
declare @tm nvarchar(50)
declare @n int
declare c1 cursor for
select coalesce(AdminTimeNo,0),coalesce(AdminTime,'') from ReordersAdminTimes
where facid = @FacID and RoNo = @RoNo and PatID = @PatID and Split = @Split
open c1
fetch next from c1 into @n,@tm
while @@fetch_status = 0 begin
if @n > 1 begin
set @times = @times + N','
end
set @times = @times + @tm
fetch next from c1 into @n,@tm
end
close c1
deallocate c1
return @times
end
如果没有可怕的光标,可以实现上述目标吗?
如果需要更多信息,请告诉我......
谢谢 大卫
答案 0 :(得分:0)
是的,这完全可行。我曾经多次这样做过。我们使用的其中一个UDF的示例:
CREATE FUNCTION [dbo].[UDF_Section_GetTimeSlots]
(
@SectionID INT
)
RETURNS VARCHAR(200)
AS
BEGIN
DECLARE @TimeSlots VARCHAR(200)
SELECT @TimeSlots = (COALESCE(@TimeSlots + ', ','') + t.[Name])
FROM
(
SELECT DISTINCT ts.[Name], ts.[Sequence]
FROM
dbo.ScheduledSection ss
JOIN dbo.TimeSlot ts ON ss.TimeSlotID = ts.TimeSlotID
WHERE
ss.SectionID = @SectionID
) AS t
ORDER BY
t.[Sequence]
RETURN COALESCE(@TimeSlots, '')
END
GO