73 lines
2.2 KiB
Transact-SQL
73 lines
2.2 KiB
Transact-SQL
-- 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 |