Онлайн час в Google Meet
Лого на 91. НЕГ „Проф. Константин Гълъбов“

12. клас · Модул 4 · Урок 7

Съхранени процедури

SQL се интерпретира, но съхранената процедура се компилира еднократно. Темплейтът CREATE PROCEDURE, формални и фактически параметри, EXEC.

Защо съхранени процедури

Езикът SQL, за разлика от C#, по принцип не се компилира, а се интерпретира: при всяко изпълнение сървърът прави синтактичен анализ на оператора и чак тогава го изпълнява — и това се повтаря всеки път. Механизмът на съхранените процедури спестява тази загуба: синтактичната правилност се проверява еднократно, резултатът се съхранява на сървъра и при следващо извикване заявката се изпълнява направо.

Темплейтът на процедурата

SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
CREATE PROCEDURE [dbo].sp<име на процедурата>
  @<параметър1> <тип> = <стойност по премълчаване>,
  @<параметърN> <тип> = <стойност по премълчаване>
AS
BEGIN
  SET NOCOUNT ON;
  <тяло на процедурата>
END
GO
  • Редовете с -- са коментари — не влизат в кода на процедурата.
  • SET ANSI_NULLS ON — сравняване с Null само чрез IS NULL / IS NOT NULL (при OFF са допустими и = Null, != Null).
  • SET QUOTED_IDENTIFIER ON— текстовите константи са в апострофи; кавичките трябват само за имена като O'Neal (тогава — OFF).
  • Имената на параметрите започват със знака @ — затова имена на атрибути не бива да почват с него.
  • Тялото е между BEGIN и END — както тялото на C# функция между { и }.
  • SET NOCOUNT ON — скрива стандартното съобщение за брой редове след SELECT.
  • GO изпраща операторите дотук за изпълнение — не е команда на T-SQL, а на инструментите (SSMS, SQLCMD, OSQL).

Създаване и изпълнение

Пример 1 — spStudentList без параметри

CREATE PROCEDURE [dbo].spStudentList AS
BEGIN
  SET NOCOUNT ON;
  SELECT name, surname, family FROM Student;
END

Натискаме Execute — SSMS не извежда резултат от заявката, а съобщението „Commands completed successfully“: процедурата е компилирана и съхранена (виж я в Programability/Stored Procedures). Изпълняваме я с:

EXEC [dbo].spStudentList

Пример 2 — spListBorn с параметри

Списък на учениците, родени в зададен интервал: два параметъра @from и @to от тип nchar(6), защото проверяваме по първите 6 цифри на ЕГН (функцията LEFT намира префикс със зададена дължина):

CREATE PROCEDURE [dbo].spListBorn
  @from nchar(6), @to nchar(6)
AS
BEGIN
  SET NOCOUNT ON;
  SELECT name, surname, family, LEFT(egn,6) FROM Student
  WHERE LEFT(egn,6) >= @from AND LEFT(egn,6) <= @to;
END
EXEC dbo.spListBorn @from = '021201', @to = '030331'

Какво трябва да запомниш

  • SQL се интерпретира; съхранената процедура се проверява еднократно и после само се изпълнява.
  • Параметри: формални (в дефиницията, с @) и фактически (при EXEC).
  • Имена: sp… да, sp_… никога (запазено за вградените).
  • SET NOCOUNT ON скрива съобщението за брой редове.
  • CREATE → ALTER за промяна; EXEC за изпълнение.