Sql вызов процедуры: Урок 15. Хранимые процедуры. Создание, использование и удаление.

Содержание

Хранимые процедуры в SQL server

Введение

Использование хранимых процедур позволяет организовать бизнес-логику и логику управления данными на стороне базы данных.

В чем плюсы такого подхода? 

Во-первых, SQL Server оптимизирует и компилирует хранимые процедуры, поэтому они выполняются быстро без необходимости повторять эти шаги каждый раз. 

Во-вторых, они выполняются на стороне базы данных, а не в коде приложения. Т.е. минимум тратится ресурсов на дополнительные обращения к базе данных. 

В-третьих, использование хранимых процедур позволяет сэкономить траффик, так как клиент посылает серверу только запрос, сервер его обрабатывает и возвращает только результат, который обычно значительно меньше, чем полный набор данных. 

Создание хранимой процедуры в SQL Server ManagementStudio

Для создания хранимой процедуры требуется выполнить следующие шаги:

выбираем базу данных, переходим на вкладуку «Программирование/Хранимые процедуры»

Создаем хранимую процедуру через контекстное меню:

Видим вот такой код:

Рассмотрим пример создания процедуры. Очищаем все и вставляем в поле следующий код:

CREATE PROCEDURE GetStudents
AS
     SELECT * FROM Students
GO

После этого нажимаем «Выполнить» (F5) и видим слева нашу хранимую процедуру:

Чтобы запустить на выполнениех хранимую процедуру, достаточно кликнуть по ней правой кнопкой мышки и выбрать пункт «выполнить хранимую процедуру». После чего отобразится вот такое окно, в котором нажимаем «ОК»:

После чего увидим результат выполнения нашей хранимой процедуры:

Вызов нашей хранимой процедуры осуществляется с помощью кода (после чего нажимаем «выполнить» или F5):

USE sampledb;
EXEC GetStudents

Результатом выполнения данного кода будет выбор всех студентов из таблицы Students:

1	[email protected]	Иван	Иванов	г. Рязань, ул. Ленина 54/2	50000,00
2	[email protected]	Петр	Петров	г. Рязань, ул. Ленина 54/3	50000,00
3	[email protected]	Илья	Ильин	г. Рязань, ул. Ленина 54/4	40000,00
4	[email protected]	Иван	Прохоров	г. Рязань, ул. Ленина 57/8	40000,00
5	bak@gmail. com	Борис	Акунин	г. Москва, ул. Лебедева 23/21	60000,00
6	[email protected]	Екатерина	Ларина	г. Шахты, ул. Пражская 4/9	60000,00
7	[email protected]	Елизавета	Бродская	г. Рязань, ул. Ленина 54/2	90000,00

Внутрениие элементы хранимых процедур

Входные параметры хранимой процедуры

У процедуры могут быть различные входные параметры, которые используются в теле процедуры. 

CREATE PROCEDURE proc1
   @s1 nvarchar(128),
   @s2 int
AS
BEGIN
   select @s1 + cast(@s2 as nvarchar)
END
GO

Вызов процедуры: 

exec proc1 @s1='123', @s2 = 0

Параметры также могут быть выходными — т.е. их значение изменено в процедуре и возвращено в вызывающую сторону. 

CREATE PROCEDURE proc2
   @s1 nvarchar(128),
   @s2 int,
   @s3 nvarchar OUTPUT
AS
BEGIN
   set @s3 = @s1 + cast(@s2 as nvarchar)
END
GO

Вызов процедуры: 

declare @test nvarchar(max)=''
exec proc1 @s1='123', @s2 = 0, @s3 = @test
print @test

Использование if

Пример хранимой процедуры с условием if:

CREATE PROCEDURE checkMaxAward
AS
BEGIN
	DECLARE @maxAward money
 
SELECT @maxAward = MAX(award) FROM Students
 
IF (@maxAward > 100000) begin
    PRINT 'максимальная сумма премии больше 100000';
end ELSE begin
    PRINT 'максимальная сумма премии меньше 100000';
end
END
GO

В данной процедуре выбираем максимальную сумму премии у студентов, в зависимости от результата выводим нужную строку. Также следует обратить внимание на выражение:

DECLARE @maxAward money

DECLARE применяется для определения переменных, после ключевого слова «DECLARE» указывается название и тип переменной. При этом название локальной переменной должно начинаться с символа @. В данном примере определяем переменную «@maxAward» с типом данных «money».

В нашем случае результат будет такой:

максимальная сумма премии меньше 100000

Циклы в хранимых процедурах SQL Server

Дальше разберем использование циклов. Разберем классический пример: вычисление факториала числа. Используем такой код:

DECLARE @number INT, @factorial INT
SET @factorial = 2;
SET @number = 10;
 
WHILE @number > 0
    BEGIN
        SET @factorial = @factorial * @number
        SET @number = @number - 2
    END;
 
PRINT @factorial

Пояснения к коду: пока переменная @number не будет равна 0, будет продолжаться цикл WHILE. Каждый проход цикла называется итерацией. В каждой итерации будет переустанавливаться значение переменных @factorial и @number.

Результатом выполнения данного кода будет:

7680

Также следует обратить внимание на ключевое слово «PRINT», которое  выводит результат нашего кода:

Инструкция OUTPUT

OUTPUT – это инструкция, возвращающая изменившиеся строки в результате выполнения инструкций INSERT, UPDATE, DELETE или MERGE.

OUTPUT может помочь в тех случаях, когда нужно проверить или узнать какие именно строки (записи) были добавлены, удалены или изменены, без дополнительных запросов на выборку (SELECT). Данная инструкция позволяет сохранить все изменения в отдельном месте, например, в таблице, благодаря этому мы можем узнать и работать, например, со списком всех идентификаторов, которые были сгенерированы и добавлены в таблицу.

Принцип работы OUTPUT: все изменения, которые производят инструкции INSERT, UPDATE, DELETE и MERGE, фиксируются, условно говоря, во временных таблицах Inserted и Deleted. Они имеют такую же структуру, как и целевая таблица. Для того чтобы посмотреть изменения, нам необходимо в инструкции OUTPUT указать соответствующий префикс и название нужного столбца, примерно так же, как мы это делаем в инструкции SELECT, перечисляя названия столбцов, тем самым мы извлечем данные из этих таблиц.

Преобразование типов данных для переменных

Функция CAST преобразует выражение одного типа к другому и имеет следующую форму:

CAST(выражение AS тип_данных)

Пример. Есть такой код:

SELECT 'Средняя премия = '+ CAST(AVG(award) AS CHAR(15)) 
FROM Students;

Преобразуем числовое значение «award».

Результатом данного кода будет:

Средняя премия =   55714.29

Также есть функция TRY_CAST для преобразования данных. Функция TRY_CAST пытается преобразовать выражение из одного типа данных в другой тип данных. Если преобразование не удалось, функция вернет NULL. В противном случае вернет преобразованное значение.

Пример, следующий код пытается преобразовать строку «test» к типу float:

SELECT   
    CASE WHEN TRY_CONVERT(float, 'test') IS NULL   
    THEN 'Cast failed'  
    ELSE 'Cast succeeded'  
END AS Result;  
GO  

Результатом данного кода будет:

Cast failed

Отличие TRY_CAST от CAST заключается в том, что если преобразование не удалось, то TRY_CAST вернет NULL, а CAST вызовет исключение.

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

Функция CONCAT, которая выполняет конкатенацию, неявно преобразуя типы аргументов к строковому типу данных. Есть следующий код:

SELECT  email, CONCAT(firstName, lastName) from Students

Результат данного кода будет следующий:

[email protected]	ИванИванов
[email protected]	ПетрПетров
[email protected]	ИльяИльин
[email protected]	ИванПрохоров
[email protected]	БорисАкунин
[email protected]	ЕкатеринаЛарина
[email protected]	ЕлизаветаБродская

Данная функция склеивает firstName и lastName в один столбец.

Стандартные функции для работы с датой и временем

Рассмотрим стандартную функцию GETDATE(), которая возвращает текущую локальную дату и время на основе системных часов в виде объекта datetime:

SELECT  getdate()

Вернет результат:

2021-11-08 21:19:58.843

Функция dateadd добавляет к дате некое значение (месяцы, дни, недели, минуты т.д.)

select dateadd(day, 1, getdate())

Работа с NULL через ISNULL, NULLIF

В условиях вы можете проверить равно ли какое то выражение через такую конструкцию: 

select * from table1 where a1 is null

Для замены NULL на какое-то значение используйте функцию ISNULL.  Если оно равно NULL, то функция возвращает значение, которое передается в качестве второго параметра:

ISNULL(выражение, значение)

Выберем всех студентов из таблицы Students, а у которых значение email NULL, заменим на надпись «неизвестно»:

SELECT firstName, lastName,
              ISNULL(email, 'неизвестно') AS Email
FROM Students

Результат этого запроса ниже:

Иван	Иванов	[email protected]
Петр	Петров	[email protected]
Илья	Ильин	[email protected]
Иван	Прохоров	[email protected]
Борис	Акунин	[email protected]
Екатерина	Ларина	[email protected]
Елизавета	Бродская	[email protected]
Семен	Зюзин	неизвестно

Последняя строка поле email было заменено на «неизвестно», т.к. имеет значение NULL.

Рассмотрим другую функцию: NULLIF. Она возвращает нулевое значение, если два указанных выражения равны. Например:

SELECT NULLIF (4,4) AS Same, NULLIF (5,7) AS Different;

 Результат:

NULL	5

возвращает NULL для первого столбца (4 и 4), потому что два входных значения одинаковы. Второй столбец возвращает первое значение (5), потому что два входных значения различны.

Полезно знать о некоторых важных системных процедурах. А именно: 

  • sp_help SP_Name : используется для получения информации о названиях параметров процедуры, их типах и т.д. Эта процедура может быть применена к любому объекту БД (таблица, триггер и т.п.)
  • sp_helptext SP_Name : используется для получения текста хранимой процедуры

Пример первая функция sp_help. Используем вот такой код:

sp_help Students

Результат выполнения данной функции ниже:

Здесь мы видим подробную информацию о таблице Students.

Пример использования второй функции: 

sp_helptext GetStudents

Результат ее выполнения:

Оптимизация хранимых процедур в SQL Server / Хабр

Доброго дня, хабрачеловек. Сегодня я бы хотел обсудить с вами тему хранимых процедур в SQL Server 2000-2005. В последнее время их написание занимало львиную долю моего времени на работе и чего уж тут скрывать – по окончанию работы с этим делом осталось достаточно информации, которой с удовольствием поделюсь с тобой %пользовательимя%.

Знания, которыми я собираюсь поделиться, к сожалению,(или к счастью) не добыты мной эмперически, а являются, в большей степени, вольным переводом некоторых статей из буржуйских интернетов.

Итак, как можно понять из названия речь пойдет об оптимизации. Сразу оговорюсь, что все действия, которые я сейчас буду описывать, действительно дают существенный(некоторые больший, некоторые меньший) прирост производительности.

Данная статья не претендует на полное раскрытие темы оптимизации, скорее это собрание практик, которые я применяю в своей работе и могу ручаться за их эффективность. Поехали!

1. Включай в свои процедуры строку — SET NOCOUNT ON: С каждым DML выражением, SQL server заботливо возвращает нам сообщение содержащее колличество обработанных записей. Данная информация может быть нам полезна во время отладки кода, но после будет совершенно бесполезной. Прописывая SET NOCOUNT ON, мы отключаем эту функцию. Для хранимых процедур содержащих несколько выражений или\и циклы данное действие может дать значительный прирост производительности, потому как колличество трафика будет значительно снижено.

CREATE PROC dbo.ProcName

AS

SET NOCOUNT ON;

--Здесь код процедуры

SELECT column1 FROM dbo.TblTable1

--Перключение SET NOCOUNT в исходное состояние

SET NOCOUNT OFF;

GO

2. Используй имя схемы с именем объекта: Ну тут думаю понятно. Данная операция подсказывает серверу где искать объекты и вместо того чтобы беспорядочно шарится по своим закромам, он сразу будет знать куда ему нужно пойти и что взять. При большом колличестве баз, таблиц и хранимых процедур может значительно сэкономить наше время и нервы.

SELECT * FROM dbo.MyTable --Вот так делать хорошо

-- Вместо

SELECT * FROM MyTable --А так делать плохо

--Вызов процедуры

EXEC dbo. MyProc --Опять же хорошо

--Вместо

EXEC MyProc --Плохо!

3. Не используй префикс «sp_» в имени своих хранимых процедур: Если имя нашей процедуры начинается с «sp_», SQL Server в первую очередь будет искать в своей главной базе данных. Дело в том, что данный префикс используется для личных внутренних хранимых процедур сервера. Поэтому его использование может привести к дополнительным расходам и даже неверному результату, если процедура с таким же имененем как у вас будет найдена в его базе.

4. Используй IF EXISTS (SELECT 1) вместо IF EXISTS (SELECT *): Чтобы проверить наличие записи в другой таблице, мы используем выражение IF EXISTS. Данное выражение возвращает true если из внутреннего выражения возвращается хоть одно изначение, не важно «1», все колонки или таблица. Возращаемые данные, в принципе никак не используются. Таким образом для сжатия трафика во время передачи данных логичнее использовать «1», как показано ниже:

IF EXISTS (SELECT 1 FROM sysobjects

WHERE name = 'MyTable' AND type = 'U')

5. Используй TRY-Catch для отлова ошибок: До 2005 сервера после каждого запроса в процедуре писалось огромное колличество проверок на ошибки. Больше кода всегда потребляет больше ресурсов и больше времени. С 2005 SQL Server’ом появился более правильный и удобный способ решения этой проблемы:

BEGIN TRY

--код

END TRY

BEGIN CATCH

--код отлова ошибки

END CATCH

Заключение

В принципе на сегодня у меня всё. Еще раз повторюсь, что здесь лишь те приёмы, которые использовал лично я в своей практике, и могу ручаться за их эффективность.

P.S.

Мой первый пост, не судите строго.

Хранимая процедура SQL Server с параметрами

Автор: Greg Robidoux
Обзор

Настоящая сила хранимых процедур заключается в возможности передавать параметры и
хранимая процедура обрабатывает разные сделанные запросы. В этом
В этом разделе мы рассмотрим передачу значений параметров в хранимую процедуру.

Пояснение

Точно так же, как у вас есть возможность использовать параметры с кодом SQL, вы также можете
настройте хранимые процедуры так, чтобы они принимали одно или несколько значений параметров. Все
примеры используют

База данных AdventureWorks.

Создание хранимой процедуры SQL с параметрами

  1. Чтобы создать хранимую процедуру с параметрами, используйте следующий синтаксис:
  2. СОЗДАТЬ ПРОЦЕДУРУ dbo.uspGetAddress @City nvarchar(30) AS
  3. Подробности и примеры см. ниже

Запрос SQL Server для преобразования в хранимую процедуру

Ниже приведен запрос, который мы хотим использовать для создания хранимой процедуры.

 ИСПОЛЬЗОВАТЬ AdventureWorks
ИДТИ

ВЫБРАТЬ *
ОТ Лицо.Адрес
ВПЕРЕД 

Идея состоит в том, чтобы создать хранимую процедуру, в которой Город передается в
хранимая процедура, чтобы она могла создавать динамические результаты. Это можно сделать следующим образом, используя
Переменная. Если мы запустим приведенный ниже код, он вернет только результаты для New
Йорк.

 ИСПОЛЬЗОВАТЬ AdventureWorks
ИДТИ

ОБЪЯВИТЬ @City nvarchar(30)
SET @City = «Нью-Йорк»

ВЫБРАТЬ *
ОТ Лицо.Адрес
ГДЕ Город = @Город

Мы могли бы использовать этот подход и постоянно обновлять переменную @City, но есть
лучший способ сделать это, создав хранимую процедуру.

Создать хранимую процедуру SQL Server с одним параметром

В этом примере мы будем запрашивать таблицу Person.Address из AdventureWorks.
базу данных, но вместо того, чтобы возвращать все записи, мы ограничим ее только определенным
город. В этом примере предполагается, что будет точное совпадение значения города.
что пройдено.

 ИСПОЛЬЗОВАТЬ AdventureWorks
ИДТИ

СОЗДАЙТЕ ПРОЦЕДУРУ dbo.uspGetAddress @City nvarchar(30)
В КАЧЕСТВЕ
ВЫБРАТЬ *
ОТ Лицо.Адрес
ГДЕ Город = @Город
ИДТИ
 

Чтобы вызвать эту хранимую процедуру, мы должны выполнить ее следующим образом:

 EXEC dbo. uspGetAddress @City = «Нью-Йорк» 

Удаление хранимой процедуры

Если вы создали хранимую процедуру и хотите воссоздать сохраненную
процедуру с тем же именем, вы можете удалить ее, используя следующую
перед попыткой создать его снова.

 ИСПОЛЬЗОВАТЬ AdventureWorks
ИДТИ

ПРОЦЕДУРА УДАЛЕНИЯ dbo.uspGetAddress

Если вы попытаетесь создать хранимую процедуру, а она уже существует, вы получите сообщение об ошибке.

Сообщение 2714, уровень 16, состояние 3, процедура uspGetAddress, строка 1 [строка запуска пакета 33]

В базе данных уже есть объект с именем uspGetAddress.

Хранимая процедура SQL Server с параметром, использующим подстановочный знак

Мы также можем сделать то же самое, но позволить пользователям дать нам отправную точку
для поиска данных.

Здесь мы можем изменить «=» на LIKE и использовать подстановочный знак «%».

 ИСПОЛЬЗОВАТЬ AdventureWorks
ИДТИ

СОЗДАЙТЕ ПРОЦЕДУРУ dbo.uspGetAddress @City nvarchar(30)
В КАЧЕСТВЕ
ВЫБРАТЬ *
ОТ Лицо. Адрес
ГДЕ Город НРАВИТСЯ @City + '%'
ИДТИ
 

Это можно выполнить следующим образом, чтобы найти все города, имена которых начинаются с «Новый».

 EXEC dbo.uspGetAddress @City = «Новый» 

Ошибка хранимой процедуры SQL Server, когда параметр не передан

В обоих предыдущих примерах предполагается, что значение параметра всегда будет
пройти. Если вы попытаетесь выполнить процедуру без передачи параметра
значение вы получите сообщение об ошибке, например, следующее:

 EXEC dbo.uspGetAddress 

Сообщение 201, уровень 16, состояние 4, процедура uspGetAddress, строка
0
Процедура или функция ‘uspGetAddress’ ожидает параметр ‘@City’, который
не поставлялся.

Хранимая процедура SQL Server использует NULL в качестве параметра по умолчанию

В большинстве случаев рекомендуется передавать все значения параметров,
но иногда это невозможно. Итак, в этом примере мы используем параметр NULL
чтобы позволить вам не передавать значение параметра. Если мы создадим и запустим это хранилище
процедура в том виде, в каком она есть, не возвращает никаких данных, потому что она ищет любой город.
значения, равные NULL.

 ИСПОЛЬЗОВАТЬ AdventureWorks
ИДТИ

СОЗДАТЬ ПРОЦЕДУРУ dbo.uspGetAddress @City nvarchar(30) = NULL
В КАЧЕСТВЕ
ВЫБРАТЬ *
ОТ Лицо.Адрес
ГДЕ Город = @Город
ИДТИ
 

Если мы запустим следующее, оно будет работать, но данные не будут возвращены.

 EXEC dbo.uspGetAddress 

Мы могли бы изменить эту хранимую процедуру и использовать функцию ISNULL, чтобы обойти
это. Таким образом, если передается значение, оно будет использоваться для сужения результата.
set, и если значение не передано, будут возвращены все записи. (Примечание: если
столбец City имеет значения NULL, эти значения не будут включены. У вас будет
добавить дополнительную логику для City IS NULL)

 ИСПОЛЬЗОВАТЬ AdventureWorks
ИДТИ

СОЗДАТЬ ПРОЦЕДУРУ dbo.uspGetAddress @City nvarchar(30) = NULL
В КАЧЕСТВЕ
ВЫБРАТЬ *
ОТ Лицо. Адрес
ГДЕ Город = ISNULL(@Город,Город)

Теперь, если мы запустим приведенную ниже команду, все данные будут возвращены из таблицы.

 EXEC dbo.uspGetAddress 

Создать хранимую процедуру SQL Server с несколькими параметрами

Настроить несколько параметров очень просто. Вам просто нужно перечислить
каждый параметр и тип данных разделены запятой, как показано ниже.

 ИСПОЛЬЗОВАТЬ AdventureWorks
ИДТИ

СОЗДАТЬ ПРОЦЕДУРУ dbo.uspGetAddress @City nvarchar(30) = NULL, @AddressLine1 nvarchar(60) = NULL
В КАЧЕСТВЕ
ВЫБРАТЬ *
ОТ Лицо.Адрес
ГДЕ Город = ISNULL(@Город,Город)
AND AddressLine1 LIKE '%' + ISNULL(@AddressLine1, AddressLine1) + '%'
ИДТИ
 

Чтобы выполнить это, вы можете сделать одно из следующего:

 -- вернуть строки, в которых City равно Calgary
EXEC dbo.uspGetAddress @City = 'Калгари'

-- вернуть строки, где City равно Calgary, а AddresLine1 содержит A
EXEC dbo.uspGetAddress @City = 'Калгари', @AddressLine1 = 'A'

-- вернуть строки, где AddresLine1 содержит Acardia
EXEC dbo. uspGetAddress @AddressLine1 = 'Акардия'

-- это вернет все строки
EXEC dbo.uspGetAddress
 

Создать или изменить хранимую процедуру SQL Server

В SQL Server 2016 и более поздних версиях есть возможность СОЗДАТЬ новый
хранимая процедура, если она еще не существует, или ИЗМЕНИТЬ процедуру, если она существует
существует. Ниже приведен пример синтаксиса для обновления сохраненного
процедура, в которой мы хотим вернуть только несколько столбцов вместо всех столбцов.

 ИСПОЛЬЗОВАТЬ AdventureWorks
ИДТИ

СОЗДАЙТЕ ИЛИ ИЗМЕНИТЕ ПРОЦЕДУРУ dbo.uspGetAddress @City nvarchar(30) = NULL, @AddressLine1 nvarchar(60) = NULL
В КАЧЕСТВЕ
ВЫБЕРИТЕ AddressLine1, AddressLine2, город, почтовый индекс
ОТ Лицо.Адрес
ГДЕ Город = ISNULL(@Город,Город)
AND AddressLine1 LIKE '%' + ISNULL(@AddressLine1, AddressLine1) + '%'
ИДТИ
 

Параметры вывода хранимой процедуры

Резюме : в этом руководстве вы узнаете, как использовать выходные параметры для возврата данных вызывающей программе.

Создание выходных параметров

Чтобы создать выходной параметр для хранимой процедуры, используйте следующий синтаксис:

 

имя_параметра тип_данных OUTPUT

Язык кода: SQL (язык структурированных запросов) (sql)

Хранимая процедура может иметь множество выходных параметров. Кроме того, выходные параметры могут иметь любой допустимый тип данных, например целое число, дату и переменный символ.

Например, следующая хранимая процедура находит продукты по модельному году и возвращает количество продуктов через выходной параметр @product_count :

 

CREATE PROCEDURE uspFindProductByModel ( @model_year МАЛЕНЬКИЙ, @product_count INT ВЫВОД ) В КАЧЕСТВЕ НАЧИНАТЬ ВЫБРАТЬ наименование товара, список цен ИЗ производство. продукция КУДА модель_год = @модель_год; ВЫБЕРИТЕ @product_count = @@ROWCOUNT; КОНЕЦ;

Язык кода: SQL (язык структурированных запросов) (sql)

В этой хранимой процедуре:

Сначала мы создали выходной параметр с именем @product_count для хранения количества найденных продуктов:

 

@product_count INT ВЫХОД

Язык кода: SQL (язык структурированных запросов) (sql)

Во-вторых, после оператора SELECT мы присвоили количеству строк, возвращаемых запросом ( @@ROWCOUNT ), значение Параметр @product_count .

Обратите внимание, что @@ROWCOUNT — это системная переменная, которая возвращает количество строк, прочитанных предыдущим оператором.

После выполнения приведенного выше оператора CREATE PROCEDURE хранимая процедура uspFindProductByModel компилируется и сохраняется в каталоге базы данных.

Если все в порядке, SQL Server выдает следующий вывод:

 

Команды выполнены успешно.

Язык кода: SQL (язык структурированных запросов) (sql)

Вызов хранимых процедур с выходными параметрами

Чтобы вызвать хранимую процедуру с выходными параметрами, выполните следующие действия:

  • Сначала объявите переменные для хранения значений возвращаемые выходные параметры
  • Во-вторых, используйте эти переменные в вызове хранимой процедуры.

Например, следующий оператор выполняет хранимую процедуру uspFindProductByModel :

 

DECLARE @count INT; EXEC uspFindProductByModel @model_year = 2018, @product_count = @count ВЫВОД; SELECT @count AS 'Количество найденных продуктов';

Язык кода: SQL (язык структурированных запросов) (sql)

На следующем рисунке показан вывод:

В этом примере:

Сначала объявите переменную @count для хранения значения вывода параметр хранимой процедуры:

 

DECLARE @count INT;

Язык кода: SQL (язык структурированных запросов) (sql)

Затем выполните хранимую процедуру uspFindProductByModel и передайте параметры:

 

EXEC uspFindProductByModel @model_year = 2018, @product_count = @count ВЫВОД;

Язык кода: SQL (язык структурированных запросов) (sql)

В этом операторе model_year равен 2018 , а переменная @count присваивает значение выходного параметра @product_count .