это не звуковой дизайн 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;
Таблицы таблиц настолько полезны, что в большинстве баз данных существует таблица постоянных таблиц с несколькими строками, которые обрабатывают большинство приложений для этой базы данных. Например, в базе данных, поддерживающей расчеты по ипотеке, достаточно 11 000 строк для обработки одной строки в день 30-летней ипотеки (30 * 366 = 10 980).
Затем с постоянной таблицы подсчета называется dbo.Tally доступен код становится просто:
select sum(N)
from dbo.Tally
were N <= @InNumber;
Использование ПОКА петель в SQL является ужасающим код запах. Иногда они могут быть необходимы, но в более чем 30-летнем программировании я могу рассчитывать на пальцы одной руки, сколько раз мне приходилось пользоваться им.
Update:
Конечно, как комментатор отмечалось выше, независимо от того, насколько эффективно эта реализация действительно звуковой дизайн будет использовать в замкнутой форме формулы (Гаусса в данном случае), когда один, как известно, существуют ,
'SET @OutNumber = ((@ InNumber) * (@ InNumber + 1))/2)' уже использует формулу Гаусса для суммирования целых чисел. Почему, по-вашему, вам нужен цикл while? –
«До тех пор, пока' @ InNumber' меньше нуля, верните значение, меньшее, чем начальное значение '@ OutNumber', в качестве статуса завершения. Запустите составной оператор, содержащий один оператор, который вычисляет значение с использованием LISP. автор получает скобки.) Завершите составной оператор. Распечатайте вычисленное значение. " Есть некоторые возможности для очистки этого фрагмента кода. – HABO