2015-05-24 3 views
-2

Я написал процедуру, которая добавляет все числа от 1 до заданного числа (вход 3 - вы получаете 6, 4 вы получаете 10 и т. Д.). Я подумал, что это забавный кусочек кода, поэтому я подумал, что превращу его в цикл while (вы начнете цикл, и он выведет все до определенного числа.While Loop Problems: Math in SQL

Вопрос: Что мне нужно ? сделать, чтобы превратить это в время цикла

То, что я

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 
+1

'SET @OutNumber = ((@ InNumber) * (@ InNumber + 1))/2)' уже использует формулу Гаусса для суммирования целых чисел. Почему, по-вашему, вам нужен цикл while? –

+0

«До тех пор, пока' @ InNumber' меньше нуля, верните значение, меньшее, чем начальное значение '@ OutNumber', в качестве статуса завершения. Запустите составной оператор, содержащий один оператор, который вычисляет значение с использованием LISP. автор получает скобки.) Завершите составной оператор. Распечатайте вычисленное значение. " Есть некоторые возможности для очистки этого фрагмента кода. – HABO

ответ

1

это не звуковой дизайн 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:

Конечно, как комментатор отмечалось выше, независимо от того, насколько эффективно эта реализация действительно звуковой дизайн будет использовать в замкнутой форме формулы (Гаусса в данном случае), когда один, как известно, существуют ,