CREATE PROC dbo.ex_SEL_ProductAll
AS
SET NOCOUNT ON -- не передавать сообщения о количестве обработанных записей
SELECT F.dtFirstDay,
F.NPech,
F.PlanCalendar,
F.PlanStand,
F.Naliv,
F.Sliv,
F.PercentProduct,
F.NalivDirty,
F.SlivDirty,
F.Shlak
FROM dbo.ex_Product AS F
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
Представленный листинг начинается с установки параметров окружения, которые позволяют изменять поведение хранимых процедур. Настройка QUOTED_IDENTIFIER определяет, интерпретировать ли строки в двойных кавычках как идентификаторы объектов (например, таблиц или столбцов). Установка ANSI_NULLS определяет, разрешены ли не-ANSI сравнения с неопределенными (NULL) значениями, что является особенно важным для хранимых процедур, параметрыкоторых могут иметь значения NULL.
Комментарии к хранимой процедуре должны содержать пример вызова процедуры для проверки ее работоспособности. С помощью SQL-команды EXEC осуществляется запуск хранимых процедур, причем весь процесс их выполнения происходит на самом компьютере-сервере. Использование хранимых процедур существенно отражается на производительности компьютеров рабочих станций. Другими словами, данная технология позволяет использовать компьютеры рабочих станций на уровне клавиатурного ввода, а все основные задачи при этом перекладываются на компьютер-сервер.
3. ИЗМЕНЕНИЕ ХРАНИМЫХ ПРОЦЕДУР
Используя команду CREATE PROCEDURE, программист сможет создать хранимые процедуры. Для их изменения можно использовать команду ALTER PROCEDURE. Преимущество ее применения состоит в том, что сохраняются права доступа, тогда как при использовании CREATE PROCEDURE этого не происходит. Ключевое различие между ними в том, что ALTER PROCEDURE требует использования тех же параметров шифрования и перекомпиляции, какие изначально были использованы при ее создании оператором CREATE PROCEDURE. Если вы опустите или измените их значение при выполнении ALTER PROCEDURE, то они будут также опущены или изменены в самом определении процедуры [3].
Процедура может содержать любую допустимую команду Тransact-SQL, кроме следующих: CREATE DEFAULT, CREATE FUNCTION, CREATE PROC, CREATE RULE, CREATE SCHEMA, CREATE TR IGGER, CREATE VI EW, SET SH0WPLAN_TEXT и SET SH0WPLAN_ALL. Эти команды должны находиться в отдельных пакетах команд и поэтому не могут быть частью хранимой процедуры. Из процедур можно создавать базы данных, таблицы и индексы, но нельзя создавать другие процедуры, стандартные значения, функции, правила, схемы, триггеры или представления.
Это предупреждение появляется вследствие того, что процедуры test2 еще не существует при создании процедуры test. Вы можете его полностью проигнорировать.
4 ВЫПОЛНЕНИЕ ХРАНИМЫХ ПРОЦЕДУР
Процесс выполнения хранимой процедуры возможен, но написать ее имя нужно в пакете команд. Необходимо создавать сам ЕХЕС перед именем хранимой процедуры: EXEC dbo.sp_who.Вызов хранимой процедуры без ключевого слова ЕХЕС должен быть первым в пакете команд, поэтому, если в дальнейшем перед вызовом процедуры добавятся какие-нибудь строки, ваш код перестанет работать.
Необходимо добавлять префикс имени владельца при вызове процедуры (dbo в предыдущем примере). Если не указать владельца, сервер установит блокировку компиляции на хранимую процедуру, так как он не может сразу найти его в кэше процедуры. Эта блокировка снимается, как только владелец найден в кэше, однако это может привести к проблемам в приложениях, требующих высокой производительности. Указание владельца — просто хорошая привычка. Это одна из тех вещей, которую вы можете сделать, чтобы заранее избавить себя от проблем.
Связку I NSERT-EXEC возможно применить с работой расширенных хранимых процедур.
Компиляция плана выполнения и выполнение происходит следующим образом. При первом запуске хранимой процедуры она компилируется, и для нее создается план выполнения. План компилируется не в машинный код и даже не в байт-код, а псевдокомпилируется для ускорения выполнения. Под «псевдокомпилируется» я имею в виду, что определяются ссылки на объекты, выбираются способы объединения и индексы и оптимизатор SQL Server строит наиболее эффективный план для выполнения хранимой процедуры. Оптимизатор сравнивает различные планы выполнения и выбирает тот, использование которого будет стоить меньше в терминах полного времени выполнения. Оптимизатор принимает решение, основываясь на множестве параметров, включая оценку количества операций ввода- вывода, связанную с каждым планом, потребность в процессорном времени, требуемый объем памяти и т. д.
После создания план выполнения помещается в кэш для дальнейшего использования. Этот кэш растет и уменьшается по мере необходимости, чтобы хранить планы выполнения хранимых процедур и прямых запросов, выполненных сервером. SQL Server поддерживает равновесие между объемами памяти, выделяемыми под процедурный кэш и для других целей (например, для кэша данных). Очевидно, что память, используемая для кэширования планов выполнения, не может использоваться для кэширования данных, так что сервер очень осторожно управляет соотношением объемов памяти процедурного кэша и кэша данных. Кэширование плана выполнения позволяет оптимизатору не перестраивать его при каждом запуске процедуры, что очень сильно повышает производительность.
5 НЕКОТОРЫЕ ОСОБЕННОСТИ И ДЕТАЛИ ПРИ ИСПОЛЬЗОВАНИИ ХРАНИМЫХ ПРОЦЕДУР
Временные процедуры создаются так же, как и временные таблицы: путем добавления префикса # создается локальная временная процедура, видимая только в текущем соединении, а добавление префикса ## создает глобальную временную процедуру, доступную для всех соединений. Временные процедуры полезны, когда возникает необходимость объединить преимущества хранимых процедур, такие как повторное использование плана выполнения и расширенные возможности обработки ошибок с преимуществами прямых запросов. Поскольку можно создавать и запускать временные процедуры «налету», то в результате на практике неоходимо применять лучшее из обоих методов. В принципе, sp_executesq 1 может избавить нас от использования временных процедур, но мы можем их использовать, если нам необходима функциональность большая, чем может предоставить sp_executesq I.
Системные процедуры находятся в базе данных master и имеют префикс sp_. Вы можете выполнять системные хранимые процедуры из любой базы данных, при этом системная процедура выполняется в контексте этой базы данных. Так, например, если процедура ссылается на таблицу sysobjects (которая существует в каждой базе данных), она получит доступ к таблице sysobjects в базе данных, которая была текущей в момент запуска процедуры, а не к таблице из базы данных Master/
Отдельные команды Transact-SQL определяют порядок выполнения команд хранимой процедуры или пакета команд. Эти команды называются командами управления выполнением: IF... ELSE, WHILE, GOTO, RETURN, WAITFOR, BREAK, CONTINUE и BEG I N...END. Далее обсудим все эти команды, а пока для примера простая хранимая процедура, которая иллюстрирует использование этих команд (Пример 2)
Пример 2. Команды управления выполнением
USE pubs
IF 0BJECT_ID('dbo. 1 istsales') IS NOT NULL DROP PROC dbo.1istsales
GO
CREATE PROC dbo.1istsales @tntle_id tid=NULL AS
IF (@title_id='/?') GOTO Help -- Here's a basic IF -- Here's one with a BEGIN..END block
IF NOT EXISTS(SELECT * FROM titles WHERE
[email protected]_id) BEGIN PRINT 'Invalid title_id'
WAITFOR DELAY '00:00:03' -- Delay 3 secs to view message RETURN -1
END
IF NOT EXISTS(SELECT * FROM sales WHERE
[email protected]_id) BEGIN PRINT 'No sales for this title'
WAITFOR DELAY '00:00:03' -- Delay 3 secs to view message RETURN -2
END
DECLARE @qty int. @totalsales int SET @totalsales=0
DECLARE с CURSOR
6. РАСШИРЕННЫЕ ХРАНИМЫЕ ПРОЦЕДУРЫ
Расширенные процедуры — это процедуры, располагающиеся в DLL и функционирующие так же, как и обычные процедуры. Они получают параметры и возвращают результаты, используя Open Data Services API SQL Server, и обычно пишутся на С или C++. Они должны находиться в базе данных master и выполняться в адресном пространстве процесса SQL Server. Хотя расширенные хранимые процедуры схожи с системными хранимыми процедурами, вызов расширенной хранимой процедуры немного отличается. Расширенные хранимые процедуры не будут автоматически найдены в базе данных master и не предполагается их выполнение в контексте текущей базы данных. Чтобы выполнить хранимую процедуру не из базы данных maste г, следует полностью указать ее имя (например, EXEC maste г. dbo. xp_cmdshel 1 dir ). Способ обойти это различие — «обернуть» расширенную хранимую процедуру в системную. Это позволяет выполнять ее из любой базы данных, не указывая префикс master. Этот способ используется для работы со многими расширенными хранимыми процедурами SQL Server. Многие из них «обернуты» в системные хранимые процедуры, которые
предназначены только для того, чтобы сделать вызов процедур немного удобнее. На примере 3 показана системная процедура — «обертки» для вызова расширенной хранимой процедуры.
Пример 3. Системные процедуры обычно используются в качестве «оберток» для расширенных процедур
USE master
IF (0BJECT_ID('dbo.sp_hexstring') IS NOT NULL)
DROP PROC dbo.sp_hexstring
GO
CREATE PROC dbo.sp_hexstring @int varchar(10)=NULL, @hexstring > ' varchar(30)=NULL OUT /*
Object: spjiexstring
Description: Return an integer as a hexadecimal string
Usage: sp_hexstring @int=Integer to convert, Phexstring=OUTPUT parm to
receive hex string
Returns: (None)
$Author: Khen $. Email:
[email protected] $Revision: 1 $
Example: spjiexstring "23", @myhex OUT Created: 1999-08-02. $Modtime: 1/4/01 8:23p $.
*/
AS
IF (@int IS NULL) OR (@int = '/?') GOTO Help DECLARE @i int. @vb varbinary(30)
SELECT @i=CAST(@int as int). @vb=CAST(@i as varbinary)