我有一个传递给标量函数的日期表:
选择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
答案 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;