Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
BD_Otveti_po_zadachi_SQL_2.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
120.06 Кб
Скачать

Отредактировать! ProblemForExamSqlQuery23.Sql - Solution

-- ****************************************************************************************

-- Удалить все многострочные комментарии в процедурах, имена которых не начинаются с 'usp_'

-- ****************************************************************************************

USE demodb

GO

IF OBJECT_ID(N'dbo.DelMultiLineComments') IS NOT NULL

DROP FUNCTION dbo.DelMultiLineComments;

GO

CREATE FUNCTION dbo.DelMultiLineComments (@Input nvarchar(4000))

RETURNS nvarchar(4000)

BEGIN

DECLARE @Output nvarchar(4000)

DECLARE @i int

IF @Input NOT LIKE '%/*%*/%'

BEGIN

SET @Output = REPLACE(@Input , CHAR(10)+CHAR(13), '')

RETURN @Output

END

ELSE

BEGIN

SET @Input = @Input + char(13)

SET @i = 1

WHILE @i <= 5

BEGIN

IF charindex('/*', @Input) > 0 and charindex('*/', @Input, charindex('/*', @Input)) -

charindex('/*',@Input) + 2 > 0

BEGIN

SET @Input = REPLACE( @Input,

substring( @Input,

charindex('/*',@Input),

charindex('*/',@Input, charindex('/*',@Input)) - charindex('/*',@Input) + 2)

, '')

END

SET @i = @i+1

END

SET @Output = dbo.DelMultiLineComments (@Input)

END

RETURN @Output

END

GO

-- ************************************************************************************

-- Тестирование хранимой процедуры

-- ************************************************************************************

USE demodb

GO

SELECT o.object_id AS ID, o.name AS ProcName, dbo.DelMultiLineComments (m.definition) AS ProcText

INTO #T1

FROM sys.objects o INNER JOIN sys.sql_modules m on o.object_id = m.object_id

WHERE o.type = 'P' AND o.name NOT LIKE 'usp_%'

GO

SELECT * FROM #T1

GO

DROP TABLE #T1

GO

Вариант 24

В базе данных Northwind создать и протестировать многооператорную табличную функцию на T-SQL, которая для цены продукта и для роли пользователя, указываемых параметрами функции, возвращает таблицу из трех столбцов: ID продукта, название продукта, цена продукта. Если цена продукта, указываемая параметром, больше 100 или текущий пользователь не является членом указанной роли или указанная роль не допустима, то функция возвращает (-1, 'ERROR', -1), иначе функция возвращает значения из таблицы Products, если текущая цена меньше или равна цены-параметра.

Вариант 25

В базе данных Northwind создать и протестировать хранимую процедуру, которая в таблице Products уменьшает цены всех продуктов на величину, задаваемую параметром процедуры. Если хотя бы для одного продукта обновленная цена окажется меньшей или равной нулю, обновление не производить, а создать сообщение об ошибке и запустить обработку ошибок для сеанса.

Вариант 26

Создать и протестировать хранимую процедуру на T-SQL, которая удаляет все представления в схеме 'dbo' в текущей базе данных, имена которых начинаются с 'vw_'. Выходной параметр возвращает количество удаленных представлений.

ProblemForExamSqlQuery25.Sql – Solution

USE demodb

GO

IF OBJECT_ID (N'dbo.DROP_VIEWS', N'P') IS NOT NULL

DROP PROCEDURE dbo.DROP_VIEWS;

GO

-- ****************************************************************************************

-- Хранимая процедура удаления всех представлений в схеме 'dbo', не начинающихся с 'vw_'

-- ****************************************************************************************

CREATE PROCEDURE dbo.DROP_VIEWS @cnt int OUTPUT

AS

BEGIN

DECLARE @view_name nvarchar(128), @SQLString nvarchar(1000);

SET @cnt = 0;

IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE type='V'

AND SCHEMA_NAME(schema_id) = 'dbo')

RETURN;

DECLARE view_list CURSOR FORWARD_ONLY STATIC FOR

SELECT name FROM sys.objects WHERE type = 'V'

AND SCHEMA_NAME(schema_id) = 'dbo'

AND name NOT LIKE 'vw_%';

OPEN view_list

FETCH NEXT FROM view_list INTO @view_name

WHILE @@FETCH_STATUS = 0

BEGIN

SET @cnt = @cnt+1;

SET @SQLString = N'IF OBJECT_ID(N''[dbo].['+@view_name+']'', ''V'') IS NOT NULL

DROP VIEW [dbo].['+@view_name+'];'

EXEC ( @SQLString );

FETCH NEXT FROM view_list INTO @view_name;

END

CLOSE view_list;

DEALLOCATE view_list;

END

GO

-- *******************************************************************************

-- Тестирование процедуры удаления представлений

-- *******************************************************************************

CREATE VIEW dbo.vw_1

AS

SELECT 'Hello world!' AS [Hello world!]

GO

CREATE VIEW dbo.vv_2

AS

SELECT 'Test' AS [Test]

GO

CREATE VIEW dbo.vv_3

AS

SELECT 'No' AS [No]

GO

DECLARE @cnt int

EXEC dbo.DROP_VIEWS @cnt OUTPUT

SELECT @cnt AS Number

GO

Вариант 27

Во временной базе данных tempdb создать две однотипных трехстолбцовых таблицы с ограничениями PRIMARY KEY, UNIQUE и CHECK. Затем создать и протестировать SQL DML триггер INSTEAD OF на событие INSERT для первой таблицы, который делает попытку добавить строки, удовлетворяющие ограничению CHECK в первую таблицу, а не удовлетворяющие ограничению CHECK во вторую таблицу. При возникновении исключения, если число инструкций BEGIN TRANSACTION, выполненных в текущем соединении больше нуля, выполнить откат транзакции.

----------------------------

USE Northwind

GO

IF OBJECT_ID ('dbo.Product$Insert', 'P') IS NOT NULL

DROP PROCEDURE dbo.Product$Insert;

GO

CREATE PROCEDURE dbo.Product$Insert

(

@product_name nvarchar(40), -- имя добавляемого продукта

@new_product_id int = null OUTPUT -- последнее значение, вставленного первичного ключа

)

AS

BEGIN

SET NOCOUNT ON

-- создаем уникальное имя точки сохранения, обрезая его до 125 символов, если оно слишком большое

DECLARE @savepoint nvarchar(128) = CAST(OBJECT_NAME(@@PROCID) AS nvarchar(125)) + -- имя текущей хранимой процедуры

CAST(@@NESTLEVEL AS nvarchar(3)) -- уровень вложенности текущей хранимой процедуры

-- запоминаем число инструкций BEGIN TRANSACTION, выполненных в текущем соединении

DECLARE @entry_trancount int = @@TRANCOUNT

BEGIN TRY

BEGIN TRANSACTION -- Отмечает начало явной транзакции

SAVE TRANSACTION @savepoint -- Устанавливает точку сохранения внутри транзакции

INSERT INTO dbo.Products(ProductName) VALUES (@product_name) -- Добавляет одну строку в таблицу Products

SET @new_product_id = SCOPE_IDENTITY() -- Возвращает последнее значение первичного ключа

COMMIT TRANSACTION -- Отмечает успешное завершение транзакции

RETURN 0

END TRY

BEGIN CATCH

SELECT 'In error handler'

-- если в текущем запросе есть активная транзакция, однако произошла ошибка, из-за которой транзакция классифицируется как нефиксируемаяа

-- и число инструкций BEGIN TRANSACTION, выполненных в текущем соединении равно 0, то ROLLBACK TRANSACTION

IF XACT_STATE()= -1 and @entry_trancount = 0

BEGIN

SELECT 'Transaction Doomed'

ROLLBACK TRANSACTION -- Откатывает транзакцию до начала

END

-- иначе если текущий запрос содержит активную пользовательскую транзакциюo, то ROLLBACK TRANSACTION к точке сохранения

ELSE IF XACT_STATE() = 1

BEGIN

SELECT 'Savepoint Rollback'

ROLLBACK TRANSACTION @savepoint -- Откатывает транзакцию до точки сохранения транзакции

COMMIT TRANSACTION -- Отмечает успешное завершение транзакции

END

-- Создается сообщение об ошибке и запускается обработка ошибок для сеанса с помощью инструкции RAISERROR

DECLARE @msg nvarchar(1000)

SET @msg = 'Error Occurred in procedure ''' + OBJECT_NAME(@@PROCID) + ''', Original Message: ''' + ERROR_MESSAGE() + ''''

RAISERROR (@msg, 16, 1)

RETURN -100

END CATCH

END

GO

-- Тестирование созданной процедуры

DECLARE @out int

DECLARE @ret int

EXEC @ret = dbo.Product$insert N'QWERTY', @out OUTPUT

IF @ret = 0 SELECT @out

GO

Вариант 28

Создать и протестировать хранимую процедуру на T-SQL, которая создает и заполняет временную таблицу #Numbers(Number int NOT NULL, Symbol nchar(1)). Столбец Number содержит номер ASCII-символа, а столбец Symbol его изображение. Начинать надо с символа, задаваемого параметром процедуры, а длина последовательности определяется вторым параметром процедуры.

Вариант 29

Создать и протестировать табличную функцию на T-SQL, которая для символьной строки, указываемой параметром функции и содержащая последовательность целых чисел, разделенных запятыми, возвращает одностолбцовую таблицу, содержащую числа.

Вариант 30

Написать и протестировать хранимую процедуру, которая в XML-документе, передаваемом в качестве параметра процедуры, выполняет следующие модификации: добавляет элемент <WarehouseID>77</WarehouseID>, удаляет элемент <Price>15</Price>, изменяет значение элемента <QuantityOnHand>500</QuantityOnHand>.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]