3. Дополните сценарий текстами перечисленных ниже хранимых процедур:
3.1. Создайте хранимую процедуру, которая для указанной таблицы подсчитывает число строк, содержащихся в этой таблице. Эта процедура должна иметь один входной параметр (с помощью которого задается имя таблицы) и один выходной параметр.
CREATE PROCEDURE procedure1
@t_name nvarchar(30),
@res int OUTPUT
AS
BEGIN
DECLARE @sql nvarchar(50)
DECLARE @p nvarchar(50)
SET @sql = N'SELECT @temp = COUNT(*) FROM ' + @t_name
SET @p = N'@temp int OUTPUT'
EXEC sp_executesql @sql, @p, @temp = @res OUTPUT
END
GO
3.2. Создайте хранимую процедуру, которая изменяет все даты, имеющиеся в таблицах базы данных, дабавляя к ним или отнимая от них некоторое число дней. Эта процедура должна иметь два входных параметра. Первый параметр определяет, нужно ли увеличивать или уменьшать все даты. Второй параметр указывает количество дней, которые должны добавляться или отниматься.
CREATE PROCEDURE procedure2
@status CHARACTER,
@days int
AS
BEGIN
DECLARE @col nvarchar(30)
DECLARE @tab nvarchar(30)
IF @status = '-'
SET @days = -@days
DECLARE cur CURSOR LOCAL DYNAMIC
FOR
SELECT COLUMN_NAME, TABLE_NAME FROM INFORMATION_SCHEMA.[COLUMNS] c
WHERE (c.DATA_TYPE='datetime')
OPEN cur
FETCH NEXT FROM cur INTO @col, @tab
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC ('UPDATE '+@tab+' SET '+@col+' = DATEADD(day, '+@days+', '+@col+')')
FETCH NEXT FROM cur INTO @col, @tab
END
END
GO
3.3. Создайте хранимую процедуру, которая для конкретной таблицы подсчитывает минимальное, среднее, максимальное и суммарное значения в столбце числового типа. Эта процедура должна иметь один входной параметр (с помощью которого указывается имя или номер столбца) и четыре выходных параметра.
CREATE PROCEDURE procedure3
@c_name nvarchar(30),
@r_min int OUTPUT,
@r_avg int OUTPUT,
@r_max int OUTPUT,
@r_sum int OUTPUT
AS
BEGIN
DECLARE @sql nvarchar(50),
@p nvarchar(50)
SET @sql = N'SELECT @t_min = MIN(' +@c_name + ') FROM материалы'
SET @p = N'@t_min int OUTPUT'
EXEC sp_executesql @sql, @p, @t_min = @r_min OUTPUT
SET @sql = N'SELECT @t_avg = AVG(' +@c_name + ') FROM материалы'
SET @p = N'@t_avg int OUTPUT'
EXEC sp_executesql @sql, @p, @t_avg = @r_avg OUTPUT
SET @sql = N'SELECT @t_max = MAX(' +@c_name + ') FROM материалы'
SET @p = N'@t_max int OUTPUT'
EXEC sp_executesql @sql, @p, @t_max = @r_max OUTPUT
SET @sql = N'SELECT @t_sum = SUM(' +@c_name + ') FROM материалы'
SET @p = N'@t_sum int OUTPUT'
EXEC sp_executesql @sql, @p, @t_sum = @r_sum OUTPUT
END
GO
3.4. Создайте хранимую процедуру, которая из конкретной таблицы отбирает строки по условию, налагаемому на значения конкретных двух столбцов. Эта процедура должна иметь два входных параметра, задающих значения для отбора данных по каждому из этих столбцов. При этом значение NULL должно трактоваться как отсутствие какого-либо критерия отбора строк по данному столбцу (например, если оба параметра будут иметь значение NULL, то должны быть выбраны все строки таблицы).
CREATE PROCEDURE procedure4
@param1 nvarchar(30),
@param2 nvarchar(30)
AS
BEGIN
IF (@param1 IS NOT NULL) AND (@param2 IS NULL)
EXEC (N'SELECT * FROM материалы WHERE цена > ' + @param1)
ELSE
IF (@param1 IS NULL) AND (@param2 IS NOT NULL)
EXEC (N'SELECT * FROM материалы WHERE цена < ' + @param2)
ELSE
IF (@param1 IS NOT NULL) AND (@param2 IS NOT NULL)
EXEC (N'SELECT * FROM материалы WHERE цена > ' + @param1 + ' AND цена< '+@param2)
ELSE
EXEC (N'SELECT * FROM материалы')
END
