我有大约940行的表格。我正在创建一个专门的计算,需要解决以下问题:

对于每一行,我可以乘A多少次而不会超过B。

我创建了一个UDF来做到这一点,如下所示:

DECLARE @x int;
DECLARE @Result decimal(18,4);
DECLARE @CutOff int;

SELECT @x=0, @CutOff=1000, @Result=null;

WHILE (((@Result < @tVal) or (@Result IS NULL)) AND @x < @CutOff) BEGIN
    SET @x = @x + 1;
    SET @Result = @hProb * @x;
END

IF (@x = @CutOff)
    SET @x = -1;

RETURN @x;



@tVal是我们希望实现的目标值。
@CutOff是要乘以的最大数字,如果x达到该数字并且仍未超过目标值,则停止循环并返回负数


这可以工作,但是我的SP通常需要大约20秒才能运行,而当我添加此功能时,它会增加大约6.5分钟的处理时间。

如果可能的话,我希望有一个更有效的方法来执行此操作,但到目前为止我找不到更好的解决方案。

感谢所有帮助。

最佳答案

select case
    when @hProb * @Cutoff <= @tVal then -1
    else floor(@tVal / @hProb)
end;


根据参数的实际数据类型,它可能会有副作用。

关于sql-server - TSQL代数-求解x((a)x <b),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25446985/

10-10 07:36