SQL

Microsoft SQL Процедура получения количества товара на определенную сумму. Использование переменных после SELECT?

Есть определенная сумма, нужно вычислить с помощью процедуры, какое количество товара можно за нее купить. Количество товара на складе ограничено, это тоже необходимо учитывать.

SELECT quantity, price FROM Goods WHERE ID=1;

Произвожу селект и получаю количество и цену товара с нужным ID. Как действовать дальше с полученными данными? Могу я использовать quantity, price как переменные и дальше производить операции с ними так же, как в языках программирования?
да, конечно:
DECLARE
@quantity integer,
@price money

SELECT
@quantity = quantity,
@price = price
FROM Goods WITH(NOLOCK)
WHERE
ID=1

только зачем процедура? лучше функция, возвращающая табличное значение.
ну раз надо процедуру - пусть будет процедура

CREATE PROCEDURE dbo.[Какое количество товара я могу купить] (
@Sum money
)
AS
BEGIN

-- объявляем "корзинку" - табличную переменную,
-- в которую будем сгружать отобранные товары
DECLARE @selected_goods TABLE (
ID uniqueidentifier,
quantity integer,
price money
),
-- объявляем всякие вспомогательные переменные
@ID uniqueidentifier,
@quantity integer,
@quantity_to_buy integer,
@price money

-- объявляем курсор, вытаскивающий товары в наличии по убыванию цены
DECLARE goodsCur CURSOR LOCAL STATIC FOR
SELECT
ID,
quantity,
price
FROM
Goods WITH(NOLOCK)
WHERE
quantity > 0
ORDER BY
price DESC

-- открываем курсор
OPEN goodsCur

-- вытаскиваем из курсора очередную запись в локальные переменные
FETCH NEXT FROM goodsCur INTO @ID, @quantity, @price

-- цикл, пока курсор не дошел до конца и пока есть деньги
WHILE @@fetch_status = 0 AND @Sum > 0
BEGIN

-- считаем, сколько товара можно купить
SET @quantity_to_buy = @Sum / @price
IF @quantity_to_buy > @quantity SET @quantity_to_buy = @quantity

-- если товар можно купить, заносим его в корзинку
IF @quantity_to_buy > 0
BEGIN
INSERT INTO @selected_goods (ID, quantity, price)
VALUES (@ID, @quantity_to_buy, @price)
SET @Sum = @Sum - @quantity_to_buy * @price
END

-- вытаскиваем из курсора следующую запись
FETCH NEXT FROM goodsCur INTO @ID, @quantity, @price

END
-- конец цикла

-- закрываем ненужный курсор
CLOSE goodsCur
-- освобождаем ресурсы, занятые ненужным курсором
DEALLOCATE goodsCur

-- отдаем во внешний мир содержимое корзинки
SELECT * FROM @selected_goods

END

примерно так.
в синтаксисе навернякагде-нибудь напутано, но смысл, надеюсь, понятен.

P.S. ну и пользоваться этим так:
EXEC dbo.[Какое количество товара я могу купить] 1234.56
Владислав Долгов
Владислав Долгов
97 148
Лучший ответ
Ринат Смагулов Как называется путь, которым вы решили задачу через процедуры - путь с помощью курсоров? Путь с помощью селектов так же является приемлемым?