AdoNetShop/database/05_procedures.sql

73 lines
2.2 KiB
Transact-SQL
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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