While 循环问题:SQL 中的数学

While Loop Problems: Math in SQL

我编写了一个程序,将从 1 到给定数字的所有数字相加(输入 3 - 你得到 6,输入 4 你得到 10,等等)。我认为这是一段有趣的小代码,所以我想我会把它变成一个 while 循环(你启动循环,它输出所有内容直到特定数字。

问题: 我需要做什么才能将其变成 while 循环?

我有什么

CREATE Procedure MATH 
@InNumber INT,  
@OutNumber INT OUTPUT 

AS
BEGIN

WHILE @InNumber <= 0
RETURN @OutNumber -1;

BEGIN 
  SET @OutNumber=((@InNumber)*(@InNumber+1))/2)
END

 PRINT @OutNumber;
END

这不是一个合理的 SQL 设计 - 使用 tally table 代替:

with E1(N) AS ( 
  select N from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1) )E1(N)
),                                             --10E+1 or          10 rows
E2(N) as (select 1 from E1 a cross join E1 b), --10E+2 or         100 rows
E4(N) as (select 1 from E2 a cross join E2 b), --10E+4 or      10,000 rows
E8(N) as (select 1 from E4 a cross join E4 b), --10E+8 or 100,000,000 rows
cteTally(N) as (
  select top (@InNumber)
    row_number() over (order by (select null)) 
  from E8
)
select sum(N) 
from cteTally;

Tally table 非常有用,以至于在大多数数据库中都有一个永久性的 Tally table 存在,其中包含许多行,可以处理该数据库的大多数应用程序。例如,在支持抵押贷款计算的数据库中,11,000 行足以处理 30 年抵押贷款的每天一行(30 * 366 = 10,980)。

然后使用一个名为 dbo.Tally 的永久计数 table 可用代码变得简单:

select sum(N) 
from dbo.Tally
were N <= @InNumber;

在 SQL 中使用 WHILE 循环是一种可怕的代码味道。它们有时可能是必要的,但在 30 多年的编程生涯中,我不得不用一只手的手指数来数去的次数。

更新:

当然,正如上面的评论员所指出的,无论这种实现多么有效,只要已知存在,真正合理的设计都会使用封闭形式的公式(在本例中为高斯公式)。