标量的多个结果可供选择

时间:2014-10-16 14:16:51

标签: sql loops scalar

我有一个传递给标量函数的日期表:

选择getVal(' 1/1/1')返回一个浮点数。

我循环浏览日期表并设置@date, 然后将结果保存到@result,然后对该值执行日志。

如何在不进行循环的情况下获得多个结果(使用多个标量调用)?我被告知要尽量避免在sql中做循环,并且有更好的方法来执行此操作。

示例:

@DateTable
ID  Dates
1   1/1/1
2   1/3/1
3   1/4/1
4   1/2/2
5   1/3/2
6   4/15/12

set @k = 1
while @k <= (select count(ID) from @DateTable)
begin
  set @date = select Dates from @DateTable where ID = @k
  set @result = (select mySchema.getVal(@date))
  insert into @ResTable(result,logged) values (@result, LOG(@result))
  set @k = @k + 1
end

1 个答案:

答案 0 :(得分:1)

您可以将其简化为:

INSERT @ResTable (Result, Logged)
SELECT  d.Result, LOG(Result)
FROM    (   SELECT  Result = mySchema.getVal(Dates)
            FROM    @DateTable
        ) AS d;

我怀疑如果你展示mySchema.getVal()做了什么,它可能会更有效率。


要回答评论 - 如果您使用的是SQL Server 2012或更高版本,则可以使用LEAD/LAG函数,例如:

SELECT  Dates,
        PreviousDate = LAG(Dates) OVER (ORDER BY Dates),
        NextDate = LEAD(Dates) OVER (ORDER BY Dates)
FROM    @DateTable;

如果您使用的是早期版本,则需要使用APPLY

SELECT  Dates,
        PreviousDate = prev.Dates
FROM    @DateTable AS dt
        OUTER APPLY
        (   SELECT  TOP 1 Dates
            FROM    @DateTable AS Prev
            WHERE   Prev.Dates < dt.Dates
            ORDER BY Dates DESC
        ) AS prev;