此游标的替代方案 - sql server 2012

时间:2014-11-26 21:59:10

标签: sql-server cursor

我如何在没有游标的情况下重做这个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

如果没有可怕的光标,可以实现上述目标吗?

如果需要更多信息,请告诉我......

谢谢 大卫

1 个答案:

答案 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