
- •SqlQuery03.Sql – Solution
- •ProblemForExamSqlQuery04.Sql - Solution
- •Отредактировать! (вариант 23) ProblemForExamSqlQuery23.Sql - Solution
- •ProblemForExamSqlQuery09.Sql – Solution
- •ProblemForExamSqlQuery13.Sql - Solution
- •ProblemForExamSqlQuery16.Sql - Test
- •ProblemForExamSqlQuery16.Sql - Solution
- •ProblemForExamSqlQuery17.Sql - Test
- •ProblemForExamSqlQuery17.Sql - Solution
- •ProblemForExamSqlQuery20.Sql – Solution
- •Отредактировать! ProblemForExamSqlQuery23.Sql - Solution
- •ProblemForExamSqlQuery25.Sql – Solution
Базы данных. Задачи на модули SQL 2
Вариант 01
Создать и протестировать хранимую процедуру T-SQL, в которой для экземпляра SQL Server создаются резервные копии всех пользовательских баз данных. Имя файла резервной копии должно состоять из имени базы данных и даты создания резервной копии, разделенных символом нижнего подчеркивания. Дата создания резервной копии должна быть представлена в формате YYYYDDMM.
-------------------------------
Написать сценарий на T-SQL, в котором для экземпляра SQL Server создаются резервные копии всех пользовательских баз данных. Имя файла резервной копии должно состоять из имени базы данных и даты создания резервной копии, разделенных символом нижнего подчеркивания. Дата создания резервной копии должна быть представлена в формате YYYYDDMM. Созданный сценарий протестировать.
DECLARE @name VARCHAR(50) – имя базы данных
DECLARE @path VARCHAR(256) – путь к backup-файлу
DECLARE @fileName VARCHAR(256) – полная спецификация файла
DECLARE @fileDate VARCHAR(20) – часть имени backup-файла, содержащая дату его создания
SET @path = 'D:\Backup\'
SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),112)
DECLARE db_cursor CURSOR FOR
SELECT name
FROM master.dbo.sysdatabases –- sys.databases
WHERE name NOT IN ('master','model','msdb','tempdb')
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN
SET @fileName = @path + @name + '_' + @fileDate + '.BAK'
BACKUP DATABASE @name TO DISK = @fileName
FETCH NEXT FROM db_cursor INTO @name
END
CLOSE db_cursor
DEALLOCATE db_cursor
Создать и протестировать хранимую процедуру T-SQL, в которой для экземпляра SQL Server создаются резервные копии всех пользовательских баз данных. Имя файла резервной копии должно состоять из имени базы данных и даты создания резервной копии, разделенных символом нижнего подчеркивания. Дата создания резервной копии должна быть представлена в формате YYYYDDMM.
Рекомендации
Для создания резервной копии базы данных воспользоваться инструкцией BACKUP DATABASE, имеющей следующий формат:
BACKUP DATABASE имя_базы_данных TO DISK = полная_спецификация_файла_резервной_копии
Имена баз данных экземпляра SQL Server можно извлечь из системного представления sys.databases.
CREATE PROCEDURE usp_01 @path VARCHAR(256)
AS
BEGIN
DECLARE @name VARCHAR(50) -- имя базы данных
DECLARE @fileName VARCHAR(256) -- полная спецификация файла
DECLARE @fileDate VARCHAR(20) -- часть имени backup-файла, содержащая дату его создания
SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),112)
DECLARE db_cursor CURSOR FOR
SELECT name
FROM sys.databases
WHERE name NOT IN ('master','model','msdb','tempdb')
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN
SET @fileName = @path + @name + '_' + @fileDate + '.BAK'
BACKUP DATABASE @name TO DISK = @fileName
FETCH NEXT FROM db_cursor INTO @name
END
CLOSE db_cursor
DEALLOCATE db_cursor
END
GO
Условия тестирования
EXEC usp_01 @path = 'D:\BACKUP\'
GO
Вариант 02
Создать и протестировать хранимую процедуру на T-SQL, которая, не уничтожая текущую базу данных, уничтожает все таблицы в схеме 'dbo' , имена которых начинаются с префикса, указываемого параметром процедуры.
----------------------------
Создать и протестировать хранимую процедуру на T-SQL, которая, не уничтожая текущую базу данных, уничтожает все таблицы в схеме 'dbo', имена которых начинаются с префикса, указываемого параметром процедуры.
CREATE PROCEDURE usp_02 @param VARCHAR(150)
AS
BEGIN
DECLARE @tname VARCHAR(150)
DECLARE @strsql VARCHAR(300)
SELECT @tname = (SELECT TOP 1 [name] FROM sys.objects WHERE [type] = 'U' and [name] like @param+'%' ORDER BY [name])
WHILE @tname IS NOT NULL
BEGIN
SELECT @strsql = 'DROP TABLE [dbo].[' + RTRIM(@tname) + ']';
EXEC (@strsql);
PRINT 'Dropped Table : ' + @tname;
SELECT @tname = (SELECT TOP 1 [name] FROM sys.objects WHERE [type] = 'U' AND [name] LIKE @param+'%' AND [name] > @tname ORDER BY [name]);
END;
END;
GO
Условия тестирования
CREATE TABLE TableNameXXX (c1 int);
GO
CREATE TABLE TableNameYYY (c1 float);
GO
CREATE TABLE TableNameZZZ (c1 char(2));
GO
EXEC usp_02 @param='TableName';
GO
Результаты тестирования
Dropped Table : TableNameXXX
Dropped Table : TableNameYYY
Dropped Table : TableNameZZZ
-----------------
Напишите сценарий, который, не уничтожая базу данных, уничтожает все те таблицы базы данных, имена которых начинаются с фразы 'TableName'. Созданный сценарий протестировать.
USE demodb
GO
DECLARE @tname VARCHAR(150)
DECLARE @strsql VARCHAR(300)
SELECT @tname = (SELECT TOP 1 [name] FROM sys.objects WHERE [type] = 'U' and [name] like N'TableName%' ORDER BY [name])
WHILE @tname IS NOT NULL
BEGIN
SELECT @strsql = 'DROP TABLE [dbo].[' + RTRIM(@tname) + ']'
EXEC (@strsql)
PRINT 'Dropped Table : ' + @tname
SELECT @tname = (SELECT TOP 1 [name] FROM sys.objects WHERE [type] = 'U' AND [name] like N'TableName%' AND [name] > @tname ORDER BY [name])
GO
Условия тестирования
USE demodb
GO
CREATE TABLE TableNameXXX (c1 int)
GO
CREATE TABLE TableNameYYY (c1 float)
GO
CREATE TABLE TableNameZZZ (c1 char(2))
GO
Результаты тестирования
Dropped Table : TableNameXXX
Dropped Table : TableNameYYY
Dropped Table : TableNameZZZ
Вариант 03
В базе данных Northwind создать и протестировать многооператорную табличную функцию на T-SQL, которая для таблицы Employees возвращает таблицу служебных отношений, связанных с подчинением одних сотрудников, сотрудникам более высоких уровней. Возвращаемая таблица должна содержать ID сотрудника и уровень субординации.
--------------------
SqlQuery03.Sql – Solution
В базе данных Northwind создать и протестировать многооператорную табличную функцию на T-SQL, которая для таблицы Employees возвращает таблицу служебных отношений, связанных с подчинением одних сотрудников, сотрудникам более высоких уровней. Возвращаемая таблица должна содержать ID сотрудника и уровень субординации.
USE Northwind
GO
CREATE FUNCTION dbo.ufn_03(@root int)
RETURNS @Subs Table (empid int NOT NULL PRIMARY KEY, lvl int NOT NULL)
AS
BEGIN
DECLARE @lvl int = 0; -- Initialize level counter with 0
INSERT INTO @Subs(empid, lvl) -- Insert root node to @Subs
SELECT EmployeeID, @lvl FROM dbo.Employees WHERE EmployeeID = @root;
WHILE @@rowcount > 0 -- while previous level had rows
BEGIN
SET @lvl = @lvl + 1; -- Increment level counter
INSERT INTO @Subs(empid, lvl) -- Insert next level of subordinates to @Subs
SELECT C.EmployeeID, @lvl
FROM @Subs AS P /* P = Parent */ JOIN dbo.Employees AS C /* C = Child */
ON P.lvl = @lvl - 1 /* Filter parents from previous level */
AND C.ReportsTo = P.empid;
END
RETURN;
END
GO
Условия тестирования
SELECT empid, lvl FROM dbo.ufn_03(5)
GO
Результаты тестирования
5 0
6 1
7 1
9 1
Вариант 04
Создать и протестировать хранимую процедуру на T-SQL, которая для текущей базы данных выводит имена и описания типа модулей (хранимых процедур и скалярных пользовательских функции), в описаниях которых встречается строка, указываемая параметром процедуры.
-------------------
Написать хранимую процедуру с входным параметром, которая выводит имена и описания типа объектов (хранимых процедур и скалярных функций), в тексте которых на языке SQL встречается строка, задаваемая параметром процедуры. Созданную процедуру протестировать.
USE demodb
GO
IF OBJECT_ID('dbo.search_procedure', 'P') IS NOT NULL
DROP PROCEDURE dbo.search_procedure
GO
-- Создание хранимой процедуры
CREATE PROCEDURE dbo.search_procedure @search_text nvarchar(100)
AS
BEGIN
DECLARE @sql_string nvarchar(1000)
SET @sql_string =
'SELECT DISTINCT o.name AS [Имя объекта], o.type_desc AS [Описание типа объекта]
FROM sys.sql_modules m INNER JOIN sys.objects o ON m.object_id=o.object_id
WHERE m.definition LIKE ''%'+@search_text+'%'' AND (o.type=''P'' OR o.type=''FN'')'
EXEC ( @sql_string )
END
GO
-- Тестирование хранимой процедуры
EXEC dbo.search_procedure @search_text = N'XML'
-----------------
(скорее всего не то)
ProblemForExamSqlQuery04.Sql - Solution
USE Northwind
GO
-- **********************************************************************
-- Создаем функцию уровней подчинения без ограничения на уровень
-- **********************************************************************
CREATE FUNCTION dbo.Subordinates(@root int)
RETURNS @Subs Table (empid int NOT NULL PRIMARY KEY, lvl int NOT NULL)
AS
BEGIN
DECLARE @lvl int = 0; -- Initialize level counter with 0
INSERT INTO @Subs(empid, lvl) -- Insert root node to @Subs
SELECT EmployeeID, @lvl FROM dbo.Employees WHERE EmployeeID = @root;
WHILE @@rowcount > 0 -- while previous level had rows
BEGIN
SET @lvl = @lvl + 1; -- Increment level counter
INSERT INTO @Subs(empid, lvl) -- Insert next level of subordinates to @Subs
SELECT C.EmployeeID, @lvl
FROM @Subs AS P /* P = Parent */ JOIN dbo.Employees AS C /* C = Child */
ON P.lvl = @lvl - 1 /* Filter parents from previous level */
AND C.ReportsTo = P.empid;
END
RETURN;
END
GO
-- ************************************************************
-- Node ids of descendants of a given node
-- ************************************************************
SELECT empid, lvl FROM dbo.Subordinates(5)
GO
Вариант 05
Создать и протестировать скалярную функцию на T-SQL, которая для строки, указываемой параметром функции, возвращает строку, удаляя все однострочные комментарии T-SQL. При тестировании удалить все однострочные комментарии в процедурах, имена которых начинаются с префикса 'usp_'.
-------------------------------
Создать и протестировать скалярную функцию на T-SQL, которая для символьной строки, указываемой параметром функции, возвращает строку, удаляя все многострочные комментарии T-SQL. Протестировать функцию на примере процедур, имена которых начинаются с префикса 'usp_'.
-------------------