ХП с выходными параметрами

EXEC @имя_переменной=хранимая процедура [, параметр [, параметр…]]

Выполнить ХП с входным параметром

Use aromatherapy

Go

Declare @count int

Exec sp_table_validation

‘oils’,

@count OUTPUT,@full_or_fast=0

Создание ХП

CREATE PROCEDURE имя_процедуры

[список_параметров]

AS

Орераторы_процедуры

Каждый из параметров в [список_параметров] имеет структуру:

@имя_параметра тип_данных [= значение по умолчанию] [OUTPUT]

Пример ХП со значением по умолчанию:

Пример1:

CREATE PROCEDURE fam

@tab int=100

AS

SELECT tn,f,ok FROM bd

WHERE tn = @tab

Выполнение:

Use проба

Go

EXEC fam 18

Пример2:

USE проба

GO

IF EXISTS (SELECT name FROM sysobjects

WHERE name = 'p5' AND type = 'P')

DROP PROCEDURE p5

GO

CREATE PROCEDURE p5

@a1 DEC(7,2)=10,

@as CHAR(15)='см'

AS

PRINT 'Площадь круга при радиусе равном'+

STR(@a1,7,2)+' '+@as

PRINT 'равняется '+STR(@a1*@a1*3.14,8,3)+' '+@as+'^2'

Выполнение:

EXEC p5 1,'М'

Пример ХП с выходным параметром:

CREATE PROCEDURE tt

@a1 char(6)OUTPUT

AS

SET @a1 = '12345'

Выполнение:

declare @a2 char(6)

exec tt @a2 output

select @a2

ХП с возвращаемым значением:

CREATE PROCEDURE tt

AS

DECLARE @dd int

SELECT ot,tn, FROM bd

-- захват ошибки

SET @dd = @@ERROR

RETURN(@dd)

Выполнение:

declare @a1 int

exec @a1=tt

select @a1 as 'код выполнения'

Операторы

Операторы присваивания

DECLARE @v1 datetime, @v2 datetime

SET @v1=Getdate()

SET @v2=@v1+1.5

SELECT 'нач. знач.'=@v1,'конеч. знач.'=@v2

Конкатенация

DECLARE @v1 char(15), @v2 varchar(15)

SET @v1='Иванов'

SET @v2='Петров'

SELECT @v1+' и '+@v2'+'- студенты'

Операторы сравнения

= , > , < , <= , >= , <> или != , !< , !>

IF Datepart(hh, Getdate() > 12 SELECT ‘ Вторая половина дня‘

ELSE SELECT ‘Первая половина дня’

Операторы логические

NOT, AND, OR, BETWEEN, ALL, IN, EXISTS, ANY, SOME, LIKE

ALL – сравнивает скалярное значение со всеми значениями в наборе, если

условие выполняется для всех значений набора – то TRUE

IF ('Ищенко В.А.' <>ALL (SELECT f FROM bd))

IF ('Moskow' <> ALL (SELECT f FROM bd))

PRINT 'нет в списке'

ELSE PRINT 'Имеется в списке Ищенко В.А.'

ANY, SOME – если условия выполняются хотя бы для одного значения

набора

IF ('Ищенко В.А.' =ANY (SELECT f FROM bd))

PRINT 'Имеется в списке Ищенко В.А.'

ELSE PRINT 'нет в списке'

IN – совпадает выражение хотя бы с одним значением набора (аналог ANY), но позволяет использовать не только скалярные выр. но и др . или служит для ограничения выборки

IF ('Moskow' IN (SELECT city FROM authors))…

…WHERE ot in (21,15,200)

EXISTS – TRUE, если подзапрос возвращает хотя бы строку, в отличии от

ANY можно задавать множество условий

IF EXISTS (SELECT * FROM bd WHERE f='Ищенко В.А.' OR …)

PRINT 'Имеется в списке Ищенко В.А.'

ELSE PRINT 'нет в списке'

LIKE – поиск значений по заданному шаблону

% - любое количество символов

_ - подставлен один любой символ

[…] - можно подставить любой символ из указанного набора

^ - допускаются символы не входящие в набор

… WHERE city LIKE '_Sa%'

… WHERE city LIKE '_[^a-gh]%'

IF EXISTS (SELECT * FROM bd WHERE f LIKE 'Ищенко %' )

PRINT 'Имеется в списке Ищенко'

ELSE PRINT 'нет в списке'

ТРИГГЕРЫ

Триггер – особый вид хранимой процедуры, которую SQL Server выполняет автоматически при использовании команд INSERT, UPDATE, DELETE .

Существуют два вида триггеров: AFTER, INSTEAD OF.

Триггер AFTER

Вызывается после выполнения команды и работает только с таблицами. Для каждой команды может быть создано несколько триггеров и каждый триггер может применен

для нескольких команд.

Триггер INSTEAD OF

Заменяет команду, для которой он объявлен. Для каждой команды может быть создано несколько триггеров и каждый триггер может применен

для нескольких команд. Триггер создается для таблиц и представлений. Для каждого действия над таблицей или представления может быть создан только один триггер.

Создание триггеров

CREATE TRIGGER имя_триггера

ON

{table | view [WITH ENCRYPTION]

[{AFTER | INSDEAD OF}]

{[DELETE] , [INSERT] , [UPDATE]}

AS

[{IF UPDATE (colum)

[{AND | OR} UPDATE (column)]

[…n] | IF (columns_update()

{ bitwise_operator} updated_betmask}

(comparison_operator} column_betmask

[…n]

sql_statement […n]}}

где:

table | view – имя таблицы или представления к которой прикрепляется триггер

WITH ENCRYPTION – шифровка кода текста триггера

{[DELETE] , [INSERT] , [UPDATE]}- cоздаваемый триггер будет вызываться при попытке удаления, вставки, изменения данных в указанной таблице

AS – заканчивается определение триггера

IF UPDATE (colum)- разрешает выполнение триггера только при изменении в определенном столбце . Если изменяются несколько столбцов то: UPDATE (a1) OR

UPDATE (a2) AND UPDATE (a3)

IF (columns_update() – возвращает двоичное значение, каждый бит которого соответствует столбцу. Если есть изменение в столбцах, то в этих битах единицы, иначе ноль. Правый бит соответствует левому столбцу таблицы.

Парамеры, применяемые для проверки изменения столбцов:

bitwise_operator – подразумевает указание оператора побайтовой обработки &(побайтовое AND). Можно ограниченно использовать и др. побайтовые операторы.

updated_betmask – подразумевает указание константы, определяющей маску для анализа столбцов.

Пример: (columns_update() & 9) Маска для 1 и 4 столбцов

comparison_operator – после побитовой обработки проверяется полученный результат, т.е. ставятся оператор =,<,> и т.д.

column_betmask – указывается битовая маска, с которой сравнивается полученное значение. Триггер выполняется, если условие справедливо.

Пример: IF (columns_updated() & 9) = 9 если меняются 1 и 4 столбцы

IF (columns_updated() & 9) > 0 если меняется 1 или 4 столбец или оба

IF (columns_updated() & 9) < 9 если меняется 1 или 4 столбец

[…n] – можно выполнять множество проверок, какие столбцы были изменены.

sql_statement […n] – команды tsql, выполняемые при вызове триггера

Удаление триггеров

DROP TRIGGERS {trigger} [,…n]

Пример:

Создадим таблицу:

CREATE TABLE Список

(US char(5), DAT varchar(30), com varchar(30)

Наши рекомендации