-- Проверка существования и удаление базы данных StaffDB, если она существует
IF DB_ID('StaffDB') IS NOT NULL
BEGIN
DROP DATABASE StaffDB;
END
GO
-- Создание базы данных
CREATE DATABASE StaffDB;
GO
-- Переключение на созданную базу данных
USE StaffDB;
GO
-- Проверка существования и удаление таблицы StaffRecords, если она существует
IF OBJECT_ID('dbo.StaffRecords', 'U') IS NOT NULL
BEGIN
DROP TABLE dbo.StaffRecords;
END
GO
-- Создание таблицы StaffRecords с полями StaffID, StaffName и StaffSalary
CREATE TABLE StaffRecords (
StaffID int PRIMARY KEY,
StaffName varchar(50),
StaffSalary decimal(10,2)
);
GO
-- Вставка тестовых данных в таблицу StaffRecords
INSERT INTO StaffRecords VALUES (1, 'Alice', 5000.00);
INSERT INTO StaffRecords VALUES (2, 'Bob', 6000.00);
INSERT INTO StaffRecords VALUES (3, 'Charlie', 7000.00);
INSERT INTO StaffRecords VALUES (4, 'David', 8000.00);
INSERT INTO StaffRecords VALUES (5, 'Eve', 9000.00);
GO
-- Проверка существования и удаление таблицы SummaryTable, если она существует
IF OBJECT_ID('dbo.SummaryTable', 'U') IS NOT NULL
BEGIN
DROP TABLE dbo.SummaryTable;
END
GO
-- Создание итоговой таблицы SummaryTable
CREATE TABLE SummaryTable (
StaffID int,
StaffName varchar(50),
StaffSalary decimal(10,2)
);
GO
-- Проверка существования и удаление процедуры SelectTopStaff, если она существует
IF OBJECT_ID('dbo.SelectTopStaff', 'P') IS NOT NULL
BEGIN
DROP PROCEDURE dbo.SelectTopStaff;
END
GO
-- Создание процедуры для выбора трех сотрудников с максимальной зарплатой
CREATE PROCEDURE SelectTopStaff
AS
BEGIN
-- Очистка итоговой таблицы перед вставкой новых данных
DELETE FROM SummaryTable;
-- Вставка трех сотрудников с наивысшей зарплатой
INSERT INTO SummaryTable (StaffID, StaffName, StaffSalary)
SELECT TOP 3 StaffID, StaffName, StaffSalary
FROM StaffRecords
ORDER BY StaffSalary DESC;
END;
GO
-- Выполнение процедуры для заполнения итоговой таблицы
EXEC SelectTopStaff;
GO
-- Генерация XML-документа из итоговой таблицы
DECLARE @StaffXML xml;
SET @StaffXML = (SELECT * FROM SummaryTable FOR XML PATH('Employee'), ROOT('Employees'));
GO
-- Проверка, является ли первый сотрудник "Федей" с помощью метода exist
IF (SELECT @StaffXML.exist('/Employees/Employee[1][StaffName="Fedya"]')) = 1
BEGIN
PRINT 'Первый сотрудник - Федя';
END
ELSE
BEGIN
PRINT 'Первый сотрудник - не Федя';
END;
GO
-- Добавление четвертого сотрудника в итоговую таблицу
INSERT INTO SummaryTable (StaffID, StaffName, StaffSalary)
VALUES (999, 'Fedya', 1000.00);
GO
-- Проверка существования и удаление триггера CalcAvgSalaryTrigger, если он существует
IF OBJECT_ID('dbo.CalcAvgSalaryTrigger', 'TR') IS NOT NULL
BEGIN
DROP TRIGGER dbo.CalcAvgSalaryTrigger;
END
GO
-- Создание триггера для вычисления средней зарплаты после вставки или обновления
CREATE TRIGGER CalcAvgSalaryTrigger
ON SummaryTable
AFTER INSERT, UPDATE
AS
BEGIN
DECLARE @AvgStaffSalary decimal(10,2);
SELECT @AvgStaffSalary = AVG(StaffSalary) FROM SummaryTable;
PRINT 'Средняя зарплата составляет ' + CAST(@AvgStaffSalary AS varchar(20));
END;
GO