вторник, 8 июля 2025 г.
Otus, Project, 25.07.08, Project, SQL
Otus, Project, 25.07.08, Project, SQL
D:\VC25\Otus\CS\Projects\Shop\Scripts\250707\1
Create_Shop_Pro_01.sql - Procedures
Create_Shop2326.sql - main
main_250707.sql
D:\VC25\Otus\CS\Projects\Shop\Scripts\250707\3\
Shop_031.sql
Otus, Project, 25.07.08, Project, SQL
Otus, Project, 25.07.08, Project, SQL
D:\VC25\Otus\CS\Projects\Shop\Scripts\250707\2
Shop_02.sql
------------------
USE Shop
GO
BEGIN TRANSACTION;
DROP TABLE IF EXISTS dbo.OrderDetails;
DROP TABLE IF EXISTS dbo.Orders;
DROP TABLE IF EXISTS dbo.Products;
DROP TABLE IF EXISTS dbo.Users;
COMMIT TRANSACTION;
BEGIN TRANSACTION;
DROP PROCEDURE IF EXISTS dbo.AddProduct;
DROP PROCEDURE IF EXISTS dbo.ProcessOrderDetail;
DROP PROCEDURE IF EXISTS dbo.AddItemToOrderByName;
DROP PROCEDURE IF EXISTS dbo.GetUserReport;
DROP PROCEDURE IF EXISTS dbo.TotalCostCalculate
DROP PROCEDURE IF EXISTS dbo.AddNewUser;
DROP PROCEDURE IF EXISTS dbo.CreateOrder;
DROP PROCEDURE IF EXISTS dbo.AddItemToOrder;
DROP PROCEDURE IF EXISTS dbo.GetUserReport;
DROP PROCEDURE IF EXISTS dbo.CreateOrderByEmail;
COMMIT TRANSACTION;
GO
-- Таблица Products
CREATE TABLE Products (
ProductID INT IDENTITY(1,1) PRIMARY KEY,
ProductName NVARCHAR(255) NOT NULL,
Description NVARCHAR(MAX),
Price NUMERIC(10, 2) NOT NULL CONSTRAINT CK_Product_Price CHECK (Price > 0),
QuantityInStock INT NOT NULL CONSTRAINT CK_Product_Qty CHECK (QuantityInStock >= 0)
);
GO
-- Таблица Users
CREATE TABLE Users (
UserID INT IDENTITY(1,1) PRIMARY KEY,
UserName NVARCHAR(255) NOT NULL,
Email NVARCHAR(255) UNIQUE NOT NULL,
RegistrationDate DATETIME DEFAULT GETDATE()
);
GO
-- Таблица Orders
CREATE TABLE Orders (
OrderID INT IDENTITY(1,1) PRIMARY KEY,
UserID INT FOREIGN KEY REFERENCES Users(UserID),
OrderDate DATETIME DEFAULT GETDATE(),
Status NVARCHAR(50) NOT NULL
);
GO
CREATE TABLE OrderDetails (
OrderDetailID INT IDENTITY(1,1) PRIMARY KEY,
OrderID INT NOT NULL FOREIGN KEY REFERENCES Orders(OrderID),
ProductID INT NOT NULL FOREIGN KEY REFERENCES Products(ProductID),
Quantity INT NOT NULL CONSTRAINT CK_OrderDetails_Quantity CHECK (Quantity > 0),
TotalCost NUMERIC(10, 2) NULL -- Разрешаем NULL-значения
);
GO
-- ----------------------------------------------------------
CREATE PROCEDURE dbo.AddProduct
@ProductName NVARCHAR(100),
@Description NVARCHAR(255),
@Price DECIMAL(18, 2),
@QuantityInStock INT
AS
BEGIN
INSERT INTO Products (ProductName, Description, Price, QuantityInStock)
VALUES (@ProductName, @Description, @Price, @QuantityInStock);
END;
GO
-- ----------------------
CREATE PROCEDURE AddNewUser
@UserName NVARCHAR(100),
@Email NVARCHAR(100)
AS
BEGIN
INSERT INTO Users(UserName, Email)
VALUES (@UserName, @Email);
RETURN SCOPE_IDENTITY(); -- Возвращаем идентификатор нового пользователя
END;
GO
CREATE PROCEDURE CreateOrder
@UserID INT
AS
BEGIN
INSERT INTO Orders(UserID, Status)
VALUES (@UserID, 'pending');
RETURN SCOPE_IDENTITY(); -- Возвращаем идентификатор нового заказа
END;
GO
CREATE PROCEDURE AddItemToOrder
@OrderID INT,
@ProductID INT,
@Quantity INT
AS
BEGIN
DECLARE @CurrentStock INT;
SET @CurrentStock = (SELECT QuantityInStock FROM Products WHERE ProductID = @ProductID);
IF @CurrentStock >= @Quantity BEGIN
UPDATE Products SET QuantityInStock = QuantityInStock - @Quantity WHERE ProductID = @ProductID;
INSERT INTO OrderDetails(OrderID, ProductID, Quantity)
VALUES (@OrderID, @ProductID, @Quantity);
END ELSE BEGIN
PRINT 'Недостаточно товара на складе!';
END
END;
GO
CREATE PROCEDURE TotalCostCalculate
AS
BEGIN
UPDATE OrderDetails
SET TotalCost = Quantity * p.Price
FROM OrderDetails od
INNER JOIN Products p ON od.ProductID = p.ProductID;
END;
GO
CREATE PROCEDURE GetUserReport
@UserID INT
AS
BEGIN
SELECT
O.OrderID,
O.OrderDate,
O.Status,
OD.ProductID,
OD.Quantity,
OD.TotalCost,
P.ProductName,
P.Description
FROM Orders O
INNER JOIN OrderDetails OD ON O.OrderID = OD.OrderID
INNER JOIN Products P ON OD.ProductID = P.ProductID
WHERE O.UserID = @UserID;
END;
GO
-- ----------------------------------------
-- В магазин поступили товары
-- -----------------------------------------------------------------------------------------------------------------------------------------
EXEC dbo.AddProduct @ProductName = 'jackson usa', @Description = 'USA Signature guitar', @Price = 1500.00, @QuantityInStock = 13;
EXEC dbo.AddProduct @ProductName = 'Gibson LP', @Description = 'Gibson Les Paul Tribute', @Price = 1340.00, @QuantityInStock = 15;
EXEC dbo.AddProduct @ProductName = 'Schecter Plt', @Description = 'Schecter Platinium', @Price = 1700.00, @QuantityInStock = 18;
EXEC dbo.AddProduct @ProductName = 'Fender Am', @Description = 'Fender American Profi', @Price = 1000.00, @QuantityInStock = 26;
EXEC dbo.AddProduct @ProductName = 'Ibanez 550', @Description = 'Ibanez RG550', @Price = 1400.00, @QuantityInStock = 14;
EXEC dbo.AddProduct @ProductName = 'Gibson SG', @Description = 'Gibson SG Standard', @Price = 1100.00, @QuantityInStock = 24;
EXEC dbo.AddProduct @ProductName = 'Schecter BJ', @Description = 'Schecter Black Jack', @Price = 1600.00, @QuantityInStock = 16;
EXEC dbo.AddProduct @ProductName = 'Schecter Rpr', @Description = 'Schecter Reaper usa', @Price = 1400.00, @QuantityInStock = 11;
GO
-- ------------------------------------------------------------------------------------------------------------------------------------------
-- В Магазин пришли Rony James Dio и Janis Joplin.
-- Регистрация Покупателей
-- Регистрация Rony
DECLARE @UserID_Rony INT;
EXEC @UserID_Rony = Shop.dbo.AddNewUser 'Rony James Dio', 'rony@jamesdio.com';
-- Регистрация Janis
DECLARE @UserID_Janis INT;
EXEC @UserID_Janis = Shop.dbo.AddNewUser 'Janis Joplin', 'janis@joplin.com';
-- Каждый Покупатель создал один заказ
-- Rony создал Заказ
DECLARE @OrderID_Rony INT;
EXEC @OrderID_Rony = Shop.dbo.CreateOrder @UserID_Rony;
-- Janis создал Заказ
DECLARE @OrderID_Janis INT;
EXEC @OrderID_Janis = Shop.dbo.CreateOrder @UserID_Janis;
-- Каждый Покупатель выбрал товары для Заказа
-- Rony выбрал два разных Gibson
-- 2 товарные позиции в Заказе
EXEC Shop.dbo.AddItemToOrder @OrderID_Rony, 5, 2; -- 2 шт. Gibson LP
EXEC Shop.dbo.AddItemToOrder @OrderID_Rony, 1, 1; -- 1 шт. Gibson SG
-- Janis выбрала три разных позиции Schecter, Jackson , Fender
-- 3 товарные позиции в Заказе
EXEC Shop.dbo.AddItemToOrder @OrderID_Janis, 3, 2; -- 2 шт. Schecter BJ
EXEC Shop.dbo.AddItemToOrder @OrderID_Janis, 6, 3; -- 3 шт. Jackson USA
EXEC Shop.dbo.AddItemToOrder @OrderID_Janis, 8, 1; -- 1 шт. Fender Am
-- Расчет стоимости каждой товарной позиции
EXEC TotalCostCalculate
-- Магазин выдал квитанцию по каждому заказу с товарными позициями обоим Покупателям
EXEC Shop.dbo.GetUserReport @UserID_Rony;
EXEC Shop.dbo.GetUserReport @UserID_Janis;
GO
Delete, Drop, Truncate, Shrink, Giga
Delete, Drop, Truncate, Shrink, Giga
https://giga.chat/link/gcswkbvWef
USE Shop
GO
BEGIN TRANSACTION;
DROP TABLE IF EXISTS dbo.OrderDetails;
DROP TABLE IF EXISTS dbo.Orders;
DROP TABLE IF EXISTS dbo.Products;
DROP TABLE IF EXISTS dbo.Users;
COMMIT TRANSACTION;
GO
BEGIN TRANSACTION;
DROP PROCEDURE IF EXISTS dbo.AddProduct;
DROP PROCEDURE IF EXISTS dbo.ProcessOrderDetail;
DROP PROCEDURE IF EXISTS dbo.AddItemToOrderByName;
DROP PROCEDURE IF EXISTS dbo.GetUserReport;
COMMIT TRANSACTION;
GO
Delete, Drop, Truncate, Shrink, Giga
Delete, Drop, Truncate, Shrink, Giga
https://giga.chat/link/gcswkbvWef
Чтобы одним запросом удалить всю информацию из всех указанных вами таблиц,
можно воспользоваться каскадным удалением.
Однако важно учитывать зависимости между таблицами, особенно внешние ключи.
Правильная последовательность удаления предотвратит конфликты ограничений целостности.
Ниже приведён скрипт, который очищает базу данных в правильной последовательности,
начиная с зависимых таблиц и заканчивая независимыми:
BEGIN TRANSACTION; -- Очистка детальных данных о заказах (OrderDetails) TRUNCATE TABLE OrderDetails; -- Очистка заказов (Orders) TRUNCATE TABLE Orders; -- Очистка товаров (Products) TRUNCATE TABLE Products; -- Очистка пользователей (Users) TRUNCATE TABLE Users; COMMIT TRANSACTION;
------------------------------------------------
- Сначала очищается таблица
OrderDetails, потому что она зависит от таблицыOrders. - Затем удаляются сами заказы из таблицы
Orders. - Потом очищаются товары из таблицы
Products. - Наконец, пользователи удаляются из таблицы
Users.
Если вдруг внешний ключ нарушает удаление (не поддерживается TRUNCATE),
используйте команду DELETE:
BEGIN TRANSACTION; -- Удаление детальных данных о заказах (OrderDetails) DELETE FROM OrderDetails; -- Удаление заказов (Orders) DELETE FROM Orders; -- Удаление товаров (Products) DELETE FROM Products; -- Удаление пользователей (Users) DELETE FROM Users; COMMIT TRANSACTION;
-------------------------------------------------------------------------------------------------
Важно помнить, что очистка базы данных необратима,
поэтому обязательно сделайте резервную копию перед выполнением этих команд.
Если потребуется восстановить первоначальные данные или структуры,
лучше всего сохранять дампы или создавать сценарии восстановления заранее.
---------------------------------------------------------------------------------------------------
существует возможность полностью удалить таблицы из базы данных, а не только их содержимое.
Для этого применяется оператор DROP TABLE.
Пример синтаксиса удаления таблиц:
DROP TABLE [IF EXISTS] SchemaName.TableName;Например, если вы хотите удалить таблицу Users, это делается так:
DROP TABLE Shop.dbo.Users;Если таблиц несколько, можно перечислить их через запятую:
DROP TABLE Shop.dbo.Users, Shop.dbo.Orders, Shop.dbo.OrderDetails, Shop.dbo.ProductSHRINK
команда SHRINK сама по себе не очищает данные из таблиц,
а служит для уменьшения размера файлов базы данных.
То есть она уменьшает свободное пространство в файлах данных и журнала транзакций,
освобождая ресурсы на диске, но не удаляет непосредственно данные из таблиц.
Разница между очисткой данных и уменьшением файла базы данных:
- Удаление данных: Выполняется командой
DELETEилиTRUNCATE TABLE. - Эти команды удаляют содержимое таблиц, но файл базы данных сохраняет свое размер,
- даже если внутри него много свободного места.
- Уменьшение размеров файла (SHRINK):
- Команда
DBCC SHRINKDATABASEилиDBCC SHRINKFILEсжимает файлы базы данных, - физически освобождая неиспользованное пространство на диске.
- Но это никак не влияет на данные в таблицах.
- ------------------------------------------------------------------------------------
Порядок действий для полной очистки базы данных:
- Удаление данных:Используйте запросы вида:
TRUNCATE TABLE TableName;Или:DELETE FROM TableName;Опустошение всей базы данных:DBCC SHRINKDATABASE(N'Shop');- Внимание к внешним ключам и связям:
- Перед использованием вышеуказанного метода убедитесь,
- что все связи и ограничения (внешние ключи) разрешены, иначе возникнет ошибка.
- Начните с дочерних таблиц и двигайтесь вверх по иерархии связей.
-- замена 'Shop' на имя вашей базы данныхЕсли вы уверены, что нужно удалить абсолютно все данные и освободить физическое пространство,примените следующую стратегию:a. Удалите данные из всех таблиц.b. Примените сжатие базы данных (если это актуально):
Проблемы при попытке использовать TRUNCATE:
Допустим, у вас есть взаимосвязанные таблицы:
- Users → Orders → OrderDetails
Если попытаться применить TRUNCATE к родительской таблице (Users) до того,
как удалятся соответствующие записи в подчинённых таблицах (Orders и OrderDetails),
SQL Server выдаст ошибку нарушения ограничения внешнего ключа.
Решение проблемы:
Чтобы быстро очистить все таблицы, придерживайтесь следующей стратегии:
- Последовательно выполняйте операцию TRUNCATE в порядке, обратном направлению ссылок:
BEGIN TRANSACTION; -- Начинать с самой нижней таблицы (деталей заказов) TRUNCATE TABLE OrderDetails; -- Переходим к промежуточной таблице (заказам) TRUNCATE TABLE Orders; -- Затем обрабатываем главную таблицу (товары) TRUNCATE TABLE Products; -- Завершаем чисткой основной таблицы (пользователи) TRUNCATE TABLE Users; COMMIT TRANSACTION;
Однако обратите внимание, что иногда схема данных усложняется дополнительными зависимостями,
и тогда может потребоваться временно отключить внешние ключи перед операциями TRUNCATE,
а потом заново активировать их:
ALTER TABLE OrderDetails NOCHECK CONSTRAINT ALL; ALTER TABLE Orders NOCHECK CONSTRAINT ALL; -- Выполнение операций TRUNCATE... ALTER TABLE OrderDetails CHECK CONSTRAINT ALL; ALTER TABLE Orders CHECK CONSTRAINT ALL;
Альтернативный вариант:
Если же вы не хотите соблюдать строгий порядок или сталкиваетесь с
проблемами из-за большого числа взаимозависимостей,
используйте простую команду DELETE,
которая учитывает внешние ключи и позволяет проводить каскадное удаление
(при наличии настроенных правил каскадного удаления):
DELETE FROM OrderDetails; DELETE FROM Orders; DELETE FROM Products; DELETE FROM Users;
Тем не менее, запомните, что DELETE гораздо медленнее и потребляет больше ресурсов сервера,
так как ведёт запись каждой отдельной строки в журнал транзакций.
Вывод:
- TRUNCATE быстрее и эффективнее, но требует правильного порядка исполнения.
- DELETE работает дольше, но автоматически решает проблему с внешними ключами.
Выбор подходящего способа зависит от специфики вашей схемы данных и требований к скорости выполнения.
Да, конечно, существует возможность полностью удалить таблицы из базы данных, а не только их содержимое.
Для этого применяется оператор DROP TABLE.
Пример синтаксиса удаления таблиц:
DROP TABLE [IF EXISTS] SchemaName.TableName;
Например, если вы хотите удалить таблицу Users, это делается так:
DROP TABLE Shop.dbo.Users;
Если таблиц несколько, можно перечислить их через запятую:
DROP TABLE Shop.dbo.Users, Shop.dbo.Orders, Shop.dbo.OrderDetails, Shop.dbo.Products;
Важные моменты:
- Внешние ключи:
- Если таблицы связаны внешними ключами, сначала придётся удалить дочернюю таблицу
- (ту, которая ссылается на другие таблицы), а затем родительские таблицы.
- Например, сначала удалите
OrderDetails, затемOrders, потомProducts, и наконецUsers.- Резервное копирование:
- Всегда делайте резервную копию перед удалением таблиц, так как операция необратимая.
- Параметр
IF EXISTS:- Начиная с версии SQL Server 2016, появилась возможность безопасного удаления таблиц с указанием ключевого слова
IF EXISTS,- которое предотвращает возникновение ошибок, если таблица отсутствует:
DROP TABLE IF EXISTS Shop.dbo.Users;
Пример скрипта для полного удаления таблиц:
BEGIN TRANSACTION; -- Удаляем дочерние таблицы (OrderDetails) DROP TABLE IF EXISTS Shop.dbo.OrderDetails; -- Удаляем таблицы-посредники (Orders) DROP TABLE IF EXISTS Shop.dbo.Orders; -- Удаляем продукцию (Products) DROP TABLE IF EXISTS Shop.dbo.Products; -- Удаляем пользователей (Users) DROP TABLE IF EXISTS Shop.dbo.Users; COMMIT TRANSACTION;
Удалить все хранимые процедуры можно аналогичным способом, используя команду DROP PROCEDURE.
Способ 1: Поочерёдное удаление процедур вручную:
Если известно точное имя каждой процедуры, вы можете удалить каждую отдельно:
DROP PROCEDURE IF EXISTS Shop.dbo.AddNewUser;
DROP PROCEDURE IF EXISTS Shop.dbo.CreateOrderByEmail;
DROP PROCEDURE IF EXISTS Shop.dbo.AddItemToOrderByName;
DROP PROCEDURE IF EXISTS Shop.dbo.GetUserReport;
Способ 2:
Если у вас большое число хранимых процедур и вы хотите избавиться от всех сразу,
DECLARE @sqlCommand NVARCHAR(MAX) = '';
SELECT @sqlCommand += N'DROP PROCEDURE [' + SCHEMA_NAME(schema_id) + '].[' + NAME + ']; '
FROM sys.procedures
WHERE schema_id = SCHEMA_ID('Shop') AND type_desc = 'SQL_STORED_PROCEDURE';
-- Исполнить собранный SQL
EXEC sp_executesql @sqlCommand;
Примечания:
- Здесь мы собираем список всех хранимых процедур в схеме
Shop и строим команду удаления для каждой из них. - Обратите внимание, что если есть временные процедуры или процедуры вне указанной схемы, они останутся незатронутыми.
Безопасность:
Перед выполнением таких массовых операций настоятельно рекомендую убедиться, что удаляемые процедуры больше не требуются.
Также будьте внимательны, чтобы случайно не удалить важные объекты базы данных, находящиеся в другом месте.
Итоги:
- Удаление отдельными командами: подходит, если известно точное имя каждой процедуры.
- Динамическое массовое удаление: удобно, если у вас много процедур и вы хотите выполнить удаление одномоментно.
Массовое удаление всех хранимых процедур динамическим запросом:
можно воспользоваться динамическим SQL.
Лучше предварительно сохранить их исходный код, если есть вероятность возврата назад.
Данный метод удобен, если вы точно знаете схему и хотите удалить все процедуры разом.
Ниже приведён простой пример, как удалить хранимые процедуры по одному запросу.
понедельник, 7 июля 2025 г.
Stored procedures, Giga
Stored procedures, Giga
https://giga.chat/link/gcsYPVSHqM
Самый быстрый вариант (оптимизация производительности):
Если задача состоит в простом быстром удалении всех записей из таблицы
без дополнительного контроля или выдачи каких-либо уведомлений, то оптимальным решением будет следующая процедура:
CREATE PROCEDURE usp_ClearSqlLoggerFast AS BEGIN SET NOCOUNT ON; -- Отключаем лишнюю информацию о количестве затронутых строк TRUNCATE TABLE dbo.SqlLogger; -- Быстрое удаление всех записей END GOОсобенности быстрого варианта:
- Используется команда
TRUNCATE TABLE, которая быстро удаляет все записи, - минуя журнал транзакций (если таблица не связана внешними ключами).
- Режим
NOCOUNT ONпредотвращает ненужную отправку дополнительных сообщений о количестве удалённых строк. - Никаких дополнительных параметров или проверок — простая и быстрая очистка таблицы.
--------------------------------------------------------------------------------------------------------------------
Самый медленный вариант (максимум функционала и безопасности):
Если приоритетом является максимальная безопасность, контроль ошибок, поддержка транзакций,
логирование и детализация процессов, тогда процедура может стать гораздо сложнее и менее производительной:
CREATE PROCEDURE usp_ClearSqlLoggerVerbose @DebugMode BIT = 0, -- Включить режим отладки @RowsDeleted INT OUTPUT, -- Количество удалённых записей @ErrorMessage NVARCHAR(MAX) OUTPUT -- Возвращаемое сообщение об ошибке AS BEGIN DECLARE @StartTime DATETIME = GETDATE(); -- Начало процедуры DECLARE @TransactionName NVARCHAR(32) = 'ClearLogTrans'; -- Имя транзакции DECLARE @LogTable NVARCHAR(128) = 'dbo.Logs'; -- Логирующая таблица -- Настройка журнала IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Logs') EXEC('CREATE TABLE Logs (EventType NVARCHAR(50), EventText NVARCHAR(MAX));'); -- Контроль режима отладки IF (@DebugMode = 1) PRINT 'Starting procedure at ' + FORMAT(@StartTime, 'yyyy-MM-dd HH:mm:ss'); -- Проверяем доступность таблицы SqlLogger IF OBJECT_ID('dbo.SqlLogger', 'U') IS NULL BEGIN SET @ErrorMessage = 'Таблицы SqlLogger не существует.'; RETURN; END -- Открываем транзакцию BEGIN TRANSACTION @TransactionName; -- Начнём выполнение удаления BEGIN TRY DELETE FROM dbo.SqlLogger; -- Присваиваем количество удалённых записей SET @RowsDeleted = @@ROWCOUNT; -- Логируем событие INSERT INTO @LogTable VALUES ('Success', 'Удалено записей: ' + CAST(@RowsDeleted AS NVARCHAR(10))); COMMIT TRANSACTION @TransactionName; END TRY BEGIN CATCH ROLLBACK TRANSACTION @TransactionName; SET @ErrorMessage = ERROR_MESSAGE(); INSERT INTO @LogTable VALUES ('Error', @ErrorMessage); END CATCH -- Завершаем работу IF (@DebugMode = 1) PRINT 'Finished procedure at ' + FORMAT(GETDATE(), 'yyyy-MM-dd HH:mm:ss'); END
GO
--------------------------------------------------------------------------------------------------------------------------
Особенности медленного варианта:
- Имеется дополнительный режим отладки, позволяющий выводить промежуточные отчёты.
- Поддерживается ведение подробного лога всех событий (успешных и неудачных).
- Все действия выполняются в рамках транзакции, обеспечивая атомарность операций.
- Есть проверка существования целевой таблицы и управление исключительными ситуациями.
- Выводится подробное сообщение о результатах (количество удалённых записей, возможные ошибки).
Итог:
- Быстрая версия оптимизирует скорость за счёт отказа от избыточных проверок и журналов.
- Медленная версия добавляет максимум контроля, логирования и безопасности, снижая общую производительность.
-----------------------------------------------------------------------------------------------------------------------------
Если необходимо оставить операцию удаления через команду DELETE,
но добиться максимальной скорости исполнения и отказаться от ненужных проверок и информационных сообщений,
можно реализовать следующую упрощённую версию процедуры:
CREATE PROCEDURE usp_ClearSqlLoggerFastDelete AS BEGIN SET NOCOUNT ON; -- Отключаем лишнюю информацию о количестве затронутых строк DELETE FROM dbo.SqlLogger; -- Простое удаление всех записей END GO
-----------------------------------------------------------------------------------------------------------------------
Ключевые отличия быстрой версии с использованием DELETE:
- Мы применяем обычную команду
DELETE, которая удаляет записи по одной, задействуя журнал транзакций. - Тем не менее, эта версия оптимальна для небольших или средних объёмов данных.
- За счёт отключения вывода информации (
SET NOCOUNT ON) мы уменьшаем накладные расходы - на передачу сообщений о количестве удалённых строк.
- Процедуру запускают только для прямого удаления всех записей без дополнительных проверок,
- логирования или управления транзакциями.
Когда использовать такую версию:
- Эта версия полезна, если:
- Размер таблицы невелик.
- Необходимость полного восстановления данных маловероятна.
- Требуется простота и быстрота исполнения.
Таким образом, данная процедура обеспечит простое и быстрое удаление всех записей из таблицы dbo.SqlLogger,
выполняя минимальное количество шагов.