USE master; GO IF db_id (N'Bank') IS NOT NULL DROP DATABASE Bank; GO CREATE DATABASE Bank ON (NAME = Bank_dat, FILENAME = 'C:\data\Bankdat.mdf', SIZE = 10MB, MAXSIZE = 50MB, FILEGROWTH = 5MB) LOG ON (NAME = Bank_log, FILENAME = 'C:\data\Banklog.ldf', SIZE = 5MB, MAXSIZE = 25MB, FILEGROWTH = 5MB); GO USE Bank; GO CREATE TABLE Person (ID_P uniqueidentifier PRIMARY KEY ROWGUIDCOL DEFAULT (newid()), firstname char(50), secondname char(50)); GO INSERT Person (firstname, secondname) VALUES ('Jack', 'Green'); INSERT Person (firstname, secondname) VALUES ('Homer', 'Simpson'); INSERT Person (firstname, secondname) VALUES ('Kate', 'Ostin'); INSERT Person (firstname, secondname) VALUES ('Gabriel', 'Cost'); INSERT Person (firstname, secondname) VALUES ('Tina', 'Gamp'); INSERT Person (firstname, secondname) VALUES ('Steve', 'Duck'); INSERT Person (firstname, secondname) VALUES ('Steve', 'Black'); GO /* Создать хранимую процедуру, производящую выборку из некоторой таблицы и возвращающую результат выборки в виде курсора. */ IF OBJECT_ID ( 'currency_cursor', 'P' ) IS NOT NULL DROP PROCEDURE currency_cursor; GO CREATE PROCEDURE currency_cursor @currency_cursor CURSOR VARYING OUTPUT AS SET @currency_cursor = CURSOR FORWARD_ONLY STATIC FOR SELECT * FROM Person WHERE firstname NOT IN ('Steve'); OPEN @currency_cursor; GO DECLARE @MyCursor CURSOR; EXEC currency_cursor @currency_cursor = @MyCursor OUTPUT; WHILE (@@FETCH_STATUS = 0) BEGIN FETCH NEXT FROM @MyCursor; END; CLOSE @MyCursor; DEALLOCATE @MyCursor; GO /* Модифицировать хранимую процедуру п.1. таким образом, чтобы выборка осуществлялась с формированием столбца, значение которого формируется пользовательской функцией. */ IF OBJECT_ID (N'func', N'FN') IS NOT NULL DROP FUNCTION func; GO CREATE FUNCTION func (@word char(50)) RETURNS int AS BEGIN RETURN LEN (@word) END; GO IF OBJECT_ID ( 'currency_cursor1', 'P' ) IS NOT NULL DROP PROCEDURE currency_cursor1; GO CREATE PROCEDURE currency_cursor1 @currency_cursor1 CURSOR VARYING OUTPUT AS SET @currency_cursor1 = CURSOR FORWARD_ONLY STATIC FOR SELECT * , lengthname = dbo.func(Person.firstname) FROM Person WHERE firstname NOT IN ('Steve'); OPEN @currency_cursor1; GO DECLARE @MyCursor CURSOR; EXEC currency_cursor1 @currency_cursor1 = @MyCursor OUTPUT; WHILE (@@FETCH_STATUS = 0) BEGIN FETCH NEXT FROM @MyCursor; END; CLOSE @MyCursor; DEALLOCATE @MyCursor; GO /* Создать хранимую процедуру, вызывающую процедуру п.1., осуществляющую прокрутку возвращаемого курсора и выводящую сообщения, сформированные из записей при выполнении условия, заданного еще одной пользовательской функцией. */ IF OBJECT_ID (N'func1', N'FN') IS NOT NULL DROP FUNCTION func1; GO CREATE FUNCTION func1 (@a char(50)) RETURNS char(50) BEGIN DECLARE @name char(50); IF (LEN(@a) = 4) SET @name = @a ELSE SET @name = 'no4'; RETURN @name; END; GO IF OBJECT_ID ( 'currency_cursor2', 'P' ) IS NOT NULL DROP PROCEDURE currency_cursor2; GO CREATE PROCEDURE currency_cursor2 AS DECLARE @MyCursor CURSOR; DECLARE @id uniqueidentifier; DECLARE @name char(50); DECLARE @lastname char(50) EXEC currency_cursor @currency_cursor = @MyCursor OUTPUT; FETCH NEXT FROM @MyCursor INTO @id, @name, @lastname; WHILE (@@FETCH_STATUS = 0) BEGIN IF (dbo.func1(@name) = 'no4') PRINT @name; FETCH NEXT FROM @MyCursor INTO @id, @name, @lastname; END; CLOSE @MyCursor; DEALLOCATE @MyCursor; GO EXECUTE currency_cursor2; GO SELECT * FROM Person; GO /* Модифицировать хранимую процедуру п.2. таким образом, чтобы выборка формировалась с помощью табличной функции. */ CREATE FUNCTION func2 () RETURNS table AS RETURN (SELECT dbo.Person.ID_P, .Person.firstname FROM Bank.dbo.Person); GO IF OBJECT_ID ( 'currency_cursor3', 'P' ) IS NOT NULL DROP PROCEDURE currency_cursor3; GO CREATE PROCEDURE currency_cursor3 @currency_cursor3 CURSOR VARYING OUTPUT AS SET @currency_cursor3 = CURSOR FORWARD_ONLY STATIC FOR SELECT * FROM dbo.func2() WHERE firstname NOT IN ('Steve'); OPEN @currency_cursor3; GO DECLARE @MyCursor CURSOR; EXEC currency_cursor3 @currency_cursor3 = @MyCursor OUTPUT; WHILE (@@FETCH_STATUS = 0) BEGIN FETCH NEXT FROM @MyCursor; END; CLOSE @MyCursor; DEALLOCATE @MyCursor; GO