-- 05_procedures.sql -- Хранимые процедуры (Stored Procedures). -- ВАЖНО: основная бизнес-логика остаётся в C# (ADO.NET). -- Здесь только простые процедуры, чтобы показать, как ADO.NET -- умеет вызывать хранимую процедуру через CommandType.StoredProcedure. USE [AdoNetShop]; GO -- 1) Получить все товары (или только товары одной категории). -- Если @CategoryId = NULL, возвращаются все товары. IF OBJECT_ID('dbo.GetProducts', 'P') IS NOT NULL DROP PROCEDURE dbo.GetProducts; GO CREATE PROCEDURE dbo.GetProducts @CategoryId INT = NULL AS BEGIN SET NOCOUNT ON; SELECT Id, Name, Description, Price, StockQuantity, CategoryId FROM Products WHERE @CategoryId IS NULL OR CategoryId = @CategoryId ORDER BY Name; END GO -- 2) Получить один товар по идентификатору. IF OBJECT_ID('dbo.GetProductById', 'P') IS NOT NULL DROP PROCEDURE dbo.GetProductById; GO CREATE PROCEDURE dbo.GetProductById @ProductId INT AS BEGIN SET NOCOUNT ON; SELECT Id, Name, Description, Price, StockQuantity, CategoryId FROM Products WHERE Id = @ProductId; END GO -- 3) Изменить цену товара с проверкой входных данных. -- Простой пример того, как часть проверки можно вынести на сервер БД. IF OBJECT_ID('dbo.UpdateProductPrice', 'P') IS NOT NULL DROP PROCEDURE dbo.UpdateProductPrice; GO CREATE PROCEDURE dbo.UpdateProductPrice @ProductId INT, @NewPrice DECIMAL(18, 2) AS BEGIN SET NOCOUNT ON; IF @NewPrice <= 0 BEGIN -- RAISERROR: сами мы формируем сообщение об ошибке и отдаём его клиенту RAISERROR ('Цена товара должна быть больше нуля.', 16, 1); RETURN; END UPDATE Products SET Price = @NewPrice WHERE Id = @ProductId; IF @@ROWCOUNT = 0 RAISERROR ('Товар с таким Id не найден.', 16, 1); END GO