Создание хранимой процедуры — SQL Server
Twitter LinkedIn Facebook Адрес электронной почты
- Статья
- Чтение занимает 2 мин
Применимо к: SQL Server (все поддерживаемые версии) Azure SQL database Управляемый экземпляр SQL Azure Azure Synapse Analytics Analytics Platform System (PDW)
В этом разделе описывается создание хранимой процедуры Transact-SQL с помощью SQL Server Management Studio и с помощью инструкции Transact-SQL CREATE PROCEDURE.
Разрешения
Для выполнения этой инструкции требуется разрешение CREATE PROCEDURE в отношении базы данных и разрешение ALTER в отношении схемы, в которой создается процедура.
Создание хранимой процедуры
Можно использовать один из следующих способов:
Среда SQL Server Management Studio
Transact-SQL
Использование среды SQL Server Management Studio
Создание процедуры в обозревателе объектов
В обозревателе объектовподключитесь к экземпляру компонента Компонент Database Engine и разверните его.
Разверните базы данных, разверните базу данных AdventureWorks2012 , а затем разверните компонент Programmability.
Щелкните правой кнопкой мыши элемент Хранимые процедурыи выберите пункт Создать хранимую процедуру.
В меню Запрос выберите пункт Указать значения для параметров шаблона.
В диалоговом окне Задание значений для параметров шаблона введите для показанных параметров следующие значения.
Параметр Значение Автор Ваше имя Дата создания Сегодняшняя дата Описание Возвращает данные о сотрудниках. Procedure_name HumanResources.uspGetEmployeesTest @Param1 @LastName @Datatype_For_Param1 nvarchar(50) Default_Value_For_Param1 NULL @Param2 @FirstName @Datatype_For_Param2 nvarchar(50) Default_Value_For_Param2 NULL Нажмите кнопку ОК.
В редакторе запросовзамените инструкцию SELECT следующей инструкцией:
SELECT FirstName, LastName, Department FROM HumanResources. vEmployeeDepartmentHistory WHERE FirstName = @FirstName AND LastName = @LastName AND EndDate IS NULL;
Для проверки синтаксиса выберите пункт Выполнить анализ в меню Запрос. Если возвращается сообщение об ошибке, сравните инструкции с приведенными выше и при необходимости внесите исправления.
Чтобы создать процедуру, в меню «Запрос» нажмите кнопку «Выполнить«. Процедура создается как объект в базе данных.
Чтобы увидеть процедуру в обозревателе объектов, щелкните правой кнопкой мыши элемент Хранимые процедуры и выберите пункт Обновить.
Чтобы выполнить процедуру, в обозревателе объектов щелкните правой кнопкой мыши имя хранимой процедуры HumanResources.uspGetEmployeesTest и выберите пункт Выполнение хранимой процедуры.
В окне Выполнение процедуры введите Margheim в качестве значения для параметра @LastName и Diane в качестве значения для параметра @FirstName.
Предупреждение
Проверяйте все данные, вводимые пользователем. Не включайте их в сценарий, не выполнив проверку. Никогда не выполняйте команду, построенную на основании непроверенных пользовательских входных данных.
Использование Transact-SQL
Создание процедуры в редакторе запросов
В обозревателе объектовподключитесь к экземпляру компонента Компонент Database Engine.
В меню Файл выберите пункт Создать запрос.
Скопируйте следующий пример в окно запроса и нажмите кнопку Выполнить
. В данном примере создается та же хранимая процедура, что и раньше, но с другим именем процедуры.USE AdventureWorks2012; GO CREATE PROCEDURE HumanResources.uspGetEmployeesTest2 @LastName nvarchar(50), @FirstName nvarchar(50) AS SET NOCOUNT ON; SELECT FirstName, LastName, Department FROM HumanResources. vEmployeeDepartmentHistory WHERE FirstName = @FirstName AND LastName = @LastName AND EndDate IS NULL; GO
Чтобы выполнить процедуру, скопируйте следующий пример в окно создаваемого запроса и нажмите кнопку
EXECUTE HumanResources.uspGetEmployeesTest2 N'Ackerman', N'Pilar'; -- Or EXEC HumanResources.uspGetEmployeesTest2 @LastName = N'Ackerman', @FirstName = N'Pilar'; GO -- Or EXECUTE HumanResources.uspGetEmployeesTest2 @FirstName = N'Pilar', @LastName = N'Ackerman'; GO
Следующие шаги
CREATE PROCEDURE (Transact-SQL)
хранимая процедура sql — Русские Блоги
Теги: хранимая процедура sqlc
1. Концепция
Хранимые процедуры предварительно определены и скомпилированы на сервере базы данных.Набор операторов T-SQL, Является независимым объектом базы данных.
2. Особенности
Модульное программирование реализовано.
Хранимая процедура имеет функцию немедленного доступа к базе данных.
Использование хранимых процедур может повысить скорость работы программы.
Использование хранимых процедур может снизить сетевой трафик.
Использование хранимых процедур может повысить безопасность базы данных.
Хранимая процедура активируется приложением, а не выполняется системой автоматически
Хранимая процедура может принимать входные параметры и возвращаемые значения.
Определение хранимой процедуры в основном состоит из двух частей: одна — это описание имени и параметров процедуры, вторая — описание тела процедуры. Общая форма оператора для создания хранимой процедуры выглядит следующим образом:
СОЗДАТЬ процедуру <имя хранимой процедуры> [<Список параметров>] AS <Тело процесса>
Описание:
list Список параметров: состоит из одного или нескольких описаний параметров, каждое описание параметра включает
Имя параметра и тип данных параметра. Конечно, хранимые процедуры могут
Нет параметров.
body Тело процедуры: это набор операторов T-SQL, которые реализуют функцию хранимых процедур и могут содержать любое количество операторов SQL.
① Но операторы CREATE (VIEW, TRIGER, DEFAULT, RULE, PROCEDURE и т. д.) нельзя использовать в операторах SQL,
В то же время другие операторы CREATE и DROP следует использовать с осторожностью.
Чтобы сделать хранимые процедуры более удобными и мощными. Операторы управления потоком могут использоваться, главным образом, в следующих типах:
Оператор назначения. Вы можете присвоить значение выражения SQL локальной переменной.
Оператор ветвления. Используется для разработки отраслевых программ. Например: оператор IF, оператор CASE и т. Д.
Вызовите оператор хранимой процедуры CALL или EXECUTE и верните оператор из хранимой процедуры RETURN.
В дополнение к операторам управления потоком в хранилище могут использоваться курсоры.
Пример 1 Создайте хранимую процедуру без параметров, чтобы завершить запрос выбора курса каждого учащегося и его результатов.
use exp6; go CREATE procedure Proc1 AS SELECT Student.Sno,Sname,Course.Cno,Cname,Grade FROM Student,Course,cj WHERE Student.Sno=cj.Sno AND Course.Cno=cj.Cno GO выполнить Proc1-выполнить хранимую процедуруРезультат последнего предложения:
Пример 2 Создайте хранимую процедуру с параметрами, чтобы завершить запрос выборного статуса указанного курса.
go CREATE PROCEDURE Proc2 @x CHAR(2) AS SELECT Student.Sno,Sname,Course.Cno,Cname,Grade FROM Student,Course,Cj WHERE Student.Sno=Cj.Sno AND Course.Cno=Cj.Cno and [email protected] ORDER by Cj.Sno GO -Курс № 2 по выбору execute Proc2 2Результат последнего предложения:
Пример 3 Создайте хранимую процедуру с параметрами и возвращаемыми значениями, завершите вывод курса «2» студента с указанным номером студента и присвойте результат выходному параметру.
go CREATE PROCEDURE Proc3 @x CHAR (10), параметр @vgrade INT OUTPUT-output AS SELECT @vgrade=Grade FROM cj WHERE [email protected] AND Cno='2' RETURN - только один выходной параметр, конечно же, вернет его go - Исполнение declare @v1 char(9),@v2 smallint select @ v1 = '2000201' - Назначить - Запросите оценку курса 2 с помощью номера студента @ v1 и присвойте результат выходному параметру @ v2 exec Proc3 @ v1, @ v2 output - output не может быть опущен print @v2 --Запустить результат: 40Выполнить хранимую процедуру: EXEC [UTE] <имя хранимой процедуры> [[переменная параметра процесса =] {значение | переменная [OUTPUT]…} —exec и execute в порядке
Изменить хранимую процедуру:
Формат оператора: ALTER PROC [EDURE] <имя хранимой процедуры> {то же определение}
StoredУдалите хранимую процедуру: ПРОЦЕДУРА УДАЛЕНИЯ
Формат оператора: DROP PROC [EDURE] <имя хранимой процедуры>
eg:drop proc Proc3
1. Хранимые процедуры, предоставляемые SQL Server
SQL Server предоставляет многоГотовые и практичные хранимые процедуры для пользователей。
Обычно используемые хранимые процедуры делятся на 5 категорий:
Системные хранимые процедуры (sp_)
Расширенная хранимая процедура (xp_)
Удаленная хранимая процедура
Локальные хранимые процедуры
Временная хранимая процедура
StoredСистемная хранимая процедура (sp_)
системные хранимые процедуры SQL Server предназначены для администраторов,
SQL Server создается в базе данных master, когда он установлен, и принадлежит системному администратору.
позволяет пользователям легко получать информацию из системных таблиц, управлять базой данных и выполнять
Другие задачи, связанные с обновлением системных таблиц. Все команды системной хранимой процедуры начинаются с sp_,
Его роль заключается в управлении базой данных.
SQL Server предоставляет множество системных хранимых процедур для облегчения поиска и манипулирования хранилищем.
Информация в системной таблице, системная хранимая процедура может быть выполнена в любой базе данных.
Например, обычно используемые системные хранимые процедуры:
sp_ helpdb (database_name): вернуть указанную информацию базы данных sp_help (object): вернуть информацию об указанном объекте базы данных sp_addlogin: создать учетную запись пользователя SQL Server sp_datatype_info: возвращает информацию о типах данных, поддерживаемых текущей средой sp_monitor: текущее значение системных глобальных переменных, отображаемых в определенном формате
⑵ Расширенная хранимая процедура (xp_)
Расширенные хранимые процедуры обеспечивают способ, аналогичный хранимым процедурам, они динамически загружаются и выполняются динамически
Функции в библиотеке подключений (DLL) беспрепятственно расширяют функциональные возможности SQL Server. Действия, отличные от SQL Serve, могут
Его легко вызвать, и внешняя информация возвращается на SQL Server. Кроме того, расширенная хранимая процедура поддерживает возврат кодов состояния и выводов.
Примечание. Расширенные хранимые процедуры должны выполняться из основной базы данных.
Пользователи могут создавать свои собственные расширенные хранимые процедуры.
Например, вот несколько расширенных хранимых процедур:
xp_cmdshell: выполняет указанную командную строку как оболочку операционной системы и возвращает любой вывод в текстовом виде. xp_logevent: запись определенной пользователем информации в файлы журнала SQL Server или в средство просмотра событий Windows NT. xp_msver: возвращает информацию о версии SQL Server и различную информацию об окружающей среде.
⑶ Удаленная хранимая процедура
Удаленные хранимые процедуры — это хранимые процедуры, вызываемые с удаленных серверов или клиентов, подключенных к разным серверам.
⑷ частичная хранимая процедура
Локальные хранимые процедуры создаются в каждой пользовательской базе данных. Он может быть вызван только тем пользователем, который его создал.
⑸ временная хранимая процедура
Временные хранимые процедуры являются локальными, префикс перед именем «#», также может быть глобальным, префикс перед именем «##»
Временные хранимые процедуры хранятся в базе данных tempdb.
Локальные временные хранимые процедуры используются в одном пользовательском сеансе и автоматически удаляются при выходе пользователя из системы.
Глобальная временная хранимая процедура может использоваться всеми пользователями и автоматически удаляется при выходе из системы последнего пользователя.
Интеллектуальная рекомендация
Общие переменные в потоке (1)
Что касается совместного использования переменных в области действия потоков, этот тип сценария приложения не используется в реальной разработке, но он имеет большие преимущества в понимании и углубле…
Выпущен новейший IoT-модуль Digi серии XBee3
(http://www.bitconn.com/form_1/После регистрации купите модуль XBee, отправьте оценочную USB-плату и соответствующие материалы на китайском языке или подайте заявку на бесплатный оценочный комплект) D. ..
Как работает цикл событий в браузере / nodeJS
Как мы все знаем, одна из самых больших функций JS — однопоточная. Это означает, что если команда выполняется сверху вниз в JS, если предыдущая команда занимает слишком много времени, появится состоян…
Расширенное использование SQL
Продолжение предыдущего «Основного применения SQL»:https://blog.csdn.net/weichi7549/article/details/98478335 Таблицы базы данных, используемые в следующих примерах: Таблица веб-сайтов: таб…
Меню выпадения ответов jQuery
…
Вам также может понравиться
Домашнее задание 2010 года Любимое Galgame рекомендуется
2009-2010 годы почти китайские работы в выброшении Группа GAL Hanhua также возникает весной. Оригинальный блог — первым, кто порекомендует Gal Game. Напишите рекомендационную статью в конце 2010 года….
[Android] Использование Android Studio (8) — // Код TODO
Во-первых, предыдущий Серия статей Android Studio, в основном объясняющая, как использовать эту IDE, оригинальный релиз и блог-сад, просьба поддержать оригинального автора. Во-вторых, оригинал Первоис…
Простой способ вступить в силу сразу после изменения git .gitignore
Есть много способов изменить .gitignore, чтобы они вступили в силу в Интернете, например очистить кеш, отслеживаемый .gitignore, или даже очистить глобальный кеш. Вот простой и эффективный метод. Прин…
TP6 Сторонний пакет расширения файловых систем
1. Установка Официальный сайт:https://gitee.com/thans/thinkphp-filesystem-cloud Два: добавить конфигурацию в config/filesystem.php Три: начинать использование (FileSystem :: Disk(‘public’)Изменить на …
День 2 Резюме — Оператор, если утверждение и вложенное
Оператор Оператор: оператор данных, оператор сравнения, логический оператор, оператор назначения Сравнить оператор > ,<,==,!=,>=,<= Все результаты всех операторов логически Логические опер…
Программирование на T-SQL. Хранимые процедуры. Создание хранимых процедур. Переменные, параметры и коды возврата
Информатика и выч. техника \ Базы данных
Страницы работы
16 страниц (Word-файл)
Посмотреть все страницы
Скачать файл
Содержание работы
Хранимая процедура — это одна или несколько инструкций, которым дано имя и которые хранятся в базе данных. Почти любая команда языка Т-SQL может быть включена в хранимую процедуру, что делает процедуры подходящими для приложений и для решения административных задач.
При первом обращении к хранимой процедуре SQL Server генерирует планы компиляции и выполнения, которые хранятся в кэше запроса и повторно используются последующими выполнениями.
Следовательно, применяя хранимые процедуры, вы можете получить небольшой выигрыш в производительности, т. к. при последующих выполнениях хранимой процедуры исчезает необходимость в синтаксическом анализе, компиляции и генерации плана запроса.
CREATE { PROC | PROCEDURE }[schema_name.] procedure_name |
[ { @parameter[ type_schema_name. ] datatype} [VARYING][ = default ][OUT | OUTPUT ][READONLY] ][ ,…n] [ WITH<procedure_option>[ ,…n] ] AS { <sql__statement>[;][ …n ] | <method_specifier> } [;] |
Если вы хотите изменить содержимое хранимой процедуры или ее параметры, можно применить инструкцию ALTERPROCEDURE.
От простого пакета на языке T-SQL хранимую процедуру отличают используемые структуры программного кода, такие как переменные, параметры, обработка ошибок и структуры, управляющие ходом выполнения.
2.2. Переменные, параметры и коды возврата
Переменные
Переменные обеспечивают манипулирование данными, их хранение и передачу как внутри процедуры, так и между хранимыми процедурами.
В SQL Server есть два вида переменных: локальные и глобальные.
Локальная переменная обозначается одним символом «эт» (@), а глобальная переменная — двумя (@@). Кроме того, локальные переменные вы можете создавать, читать и писать в них, а глобальные переменные можно только читать.
Ниже перечислены некоторые самые популярные глобальные переменные.
Глобальная переменная |
Описание |
@@ERROR |
Код ошибки последней выполненной инструкции |
@@IDENTITY |
Последнее идентифицирующее значение, вставленное в текущем соединении |
@@ROWCOUNT |
Количество строк, обработанных последней инструкцией |
@@TRANCOUNT |
Количество открытых транзакций в текущем соединении |
@@VERSION |
Версия SQL Server |
Локальную переменную можно задать с помощью инструкции DECLARE, в которой указываете имя и тип данных переменной. Одна инструкция DECLARE может использоваться для задания нескольких переменных
Переменной можно присвоить статическое значение или значение, возвращаемое инструкцией SELECT. Для присваивания значения можно применять инструкцию SET или инструкцию SELECT, но если вы выполняете запрос, для присвоения значения вы должны использовать инструкцию SELECT. Инструкция SELECT также применяется для извлечения значения переменной.
Помимо присваивания значения с помощью инструкций SET или SELECT вы можете также присвоить значение во время объявления переменной.
Пример 2.1. |
Примеры задания значений переменных разными способами
USE Sale
GO
— объявление переменных declare @a int=(select max(price) from dbo. product)
, @b int
, @c int
, @d int
— присвоение при помощи команды select select @b= max(price) from dbo.product — присвоение при помощи команды set set @c= (select max(price) from dbo.product) set @d=@a + @b
— вывод значений переменных select @a,@b,@c, @d Параметры
Параметры — это локальные переменные, применяемые для передачи значений в хранимую процедуру во время ее выполнения. В процессе выполнения любые параметры используются точно так же, как переменные и могут читаться и записываться.
Пример 2.2. |
Объявление параметров
CREATE PROCEDURE Proc1
@parm1 INT
@parm2 VARCHAR(20)= ‘Значение по умолчанию’
AS
—Блок кода
Можно задавать параметры двух типов: входные и выходные.
Пример 2.3. |
Выходной параметр обозначается ключевым словом OUTPUT
CREATE PROCEDURE Proc2
@parm1 INT
, @parm2 VARCHAR(20)= ‘Значение по умолчанию’
, @orderid int OUTPUT
AS
—Блок кода
Похожие материалы
Информация о работе
Скачать файл
Использование хранимых процедур в SQL Server
Данный материал является переводом оригинальной статьи «MSSQLTips : Rick Dobson : Create, Alter, Drop and Execute SQL Server Stored Procedures».
У начинающих осваивать SQL Server могут присутствовать навыки проектирования и ручного запуска сценариев T-SQL, однако не все начинающие DBA понимают, как упаковать свои сценарии T-SQL для удобного повторного использования. В этой статье мы приведём примеры, иллюстрирующие основы создания, изменения и запуска хранимых процедур, чтобы упростить повторное использование кода T-SQL. Кроме этого, мы кратко опишем использование входных и выходных параметров, а также значений кодов возврата, связанных с хранимыми процедурами.
Обзор хранимых процедур SQL Server
Хранимая процедура — это сохраненный блок кода T-SQL, например запрос для вывода списка строк в таблице. Блок кода T-SQL можно сохранить в файле сценария T-SQL. Вы также можете сохранить код из файла сценария в хранимой процедуре.
Сохранение кода в хранимой процедуре, а не в файле сценария дает несколько преимуществ. Вот несколько примеров:
- Вам не нужно открывать код в хранимой процедуре, чтобы запустить ее код T-SQL. Тогда как, пользователям необходимо открыть файл сценария с его кодом, чтобы запустить код.
- Хранимые процедуры также предлагают средство ограничения доступа к базовым таблицам для запроса. Предоставляя доступ к запуску хранимых процедур без разрешения на чтение или запись в базовые таблицы, вы можете защитить данные, но по-прежнему обеспечить видимость данных в базовых таблицах с помощью хранимой процедуры.
- Вы можете использовать входные параметры с хранимыми процедурами, чтобы изменять работу кода внутри хранимой процедуры. Хотя, файлы сценариев позволяют использовать локальные переменные для изменения наборов, возвращаемых запросами, они должны предоставлять свой код, чтобы вы могли изменять локальные переменные во время выполнения.
- Обретя навыки сегментирования программного решения на части, на основе хранимых процедур, вы упрощаете изменение кода с течением времени. Добавляя код в виде коротких модульных сценариев, каждый сценарий можно будет легче читать, поддерживать и даже повторно использовать в других приложениях. Решения, основанные на файлах SQL со сценариями для запросов, могут становиться все более длинными, трудными для чтения и обслуживания, поскольку в решение продолжают вноситься последовательные изменения.
Хранимые процедуры вводят некий уровень абстракции, которого нет при сохранении кода в файле сценария. Следовательно, если у вас есть простое решение, используемое одним пользователем, которому требуется доступ к базовым источникам данных для запроса (или набора запросов), то файл сценария может быть даже лучше, поскольку он упрощает решение.
Многие блоки кода T-SQL можно запускать из хранимой процедуры. Обычно первоначальную версию кода тестируют внутри файла сценария T-SQL, а затем копируют код в тело оболочки хранимой процедуры.
После создания или изменения хранимой процедуры, содержащей один или несколько операторов SELECT, вы можете вызвать хранимую процедуру с помощью оператора EXEC. Следовательно, вы можете думать о хранимой процедуре как о контейнере, который облегчает повторное использование в нем кода T-SQL.
Создание новой хранимой процедуры SQL Server
Многие администраторы баз данных знакомы с созданием таблицы с помощью оператора CREATE TABLE. Точно так же администраторы-разработчики могут создать хранимую процедуру с помощью оператора CREATE PROC или CREATE PROCEDURE. Так же, как оператор CREATE TABLE добавляет таблицу в базу данных, оператор CREATE PROC добавляет хранимую процедуру в базу данных. Итак, вам нужно начать с новой или существующей базы данных, когда вы хотите создать хранимую процедуру, поскольку хранимая процедура фактически хранится в базе данных.
Если у вас есть соответствующие разрешения, вы можете использовать оператор CREATE DATABASE, чтобы создать новую базу данных для хранения таблиц и других типов объектов, таких как хранимые процедуры.
Следующий сценарий создает базу данных с именем CodeModuleTypes. Его первый оператор определяет главную базу данных как базу данных по умолчанию. Его второй оператор создает базу данных. В зависимости от ваших потребностей могут быть гораздо более сложные версии оператора CREATE DATABASE. Если не указано иное, простой оператор создания БД, подобный приведенному ниже, будет использовать настройки по умолчанию из БД model, которая является одной из стандартных баз данных, устанавливаемых вместе с SQL Server.
use master; GO create database CodeModuleTypes;
После того, как у вас появилась база данных, такая как CodeModuleTypes, вы можете вызвать оператор CREATE PROC в этой базе данных.
Следующий сценарий демонстрирует синтаксис, который можно использовать для создания вашей первой хранимой процедуры. Хранимая процедура в приведенном ниже коде отображает набор результатов со всеми столбцами для каждой строки из таблицы Employee в схеме HumanResources демонстрационной базы данных AdventureWorks2014. Ранее мы описали, как загрузить копию этой демонстрационной БД.
Вы можете думать о схеме, как о способе логической группировки объектов базы данных, таких как таблицы и хранимые процедуры. Эти логические группировки позволяют избежать конфликтов имен между объектами с одинаковыми именами в разных схемах. Любая база данных может иметь несколько схем. В нашем примере все хранимые процедуры обозначены, как принадлежащие схеме dbo базы данных CodeModuleTypes.
Приведенный ниже оператор CREATE PROC состоит из трех частей.
- Оператор CREATE PROC называет хранимую процедуру (и её схему, если вы явно указываете её).
- Ключевое слово as действует как маркер, обозначающий, что код определения хранимой процедуры вот-вот начнется.
- Код T-SQL, определяющий работу хранимой процедуры. В этом примере определяющим кодом является оператор SELECT для таблицы Employee в схеме HumanResources базы данных AdventureWorks2014.
use CodeModuleTypes; go create proc dbo.uspMyFirstStoredProcedure as select * from AdventureWorks2014.HumanResources.Employee;
После создания хранимой процедуры ее можно запустить с помощью оператора EXEC, подобно примеру, приведенному ниже. Именно этот оператор возвращает набор результатов со всеми столбцами для каждой строки из таблицы Employee.
exec dbo.uspMyFirstStoredProcedure
Вот отрывок из вывода, созданного предыдущим скриптом.
- На панели результатов показаны первые одиннадцать столбцов из первых семнадцати строк с данными о 290 сотрудниках компании AdventureWorks.
- Если вы хотите обработать строки, отображаемые оператором SELECT в хранимой процедуре, вам нужно будет сохранить строки набора результатов в какой-либо другой таблице или объекте SQL Server. Затем обработайте результаты в этом объекте.
Удаление хранимой процедуры SQL Server
Предыдущий сценарий создания хранимой процедуры завершится ошибкой, если хранимая процедура uspMyFirstStoredProcedure в схеме dbo уже существует. Одним из способов решения этой проблемы является удаление предыдущей версии хранимой процедуры, а затем повторный запуск сценария для создания новой версии хранимой процедуры. Вы можете удалить предыдущую версию хранимой процедуры с помощью оператора DROP PROC или DROP PROCEDURE.
drop proc dbo.uspMyFirstStoredProcedure
Вместо того, чтобы позволить оператору CREATE PROC завершиться с ошибкой при наличии предыдущей версии хранимой процедуры, обычно проверяют, существует ли уже хранимая процедура, и удаляют ее, чтобы избежать ошибки. Следующий фрагмент можно использовать для удаления предыдущей версии хранимой процедуры uspMyFirstStoredProcedure, если она уже существует. В зависимости от ваших требований и кода, определяющего хранимую процедуру, может быть полезно переименовать существующую в настоящее время хранимую процедуру вместо ее удаления.
-- conditionally drop a stored proc if object_id('dbo.uspMyFirstStoredProcedure') is not null drop proc dbo.uspMyFirstStoredProcedure go
Изменение существующей хранимой процедуры SQL Server
Следующий блок кода демонстрирует оператор ALTER PROC. Этот оператор отличается от оператора CREATE PROC тем, что он может работать только с существующей хранимой процедурой.
Этот сценарий предназначен для запуска сразу после предыдущего сценария, удаляющего uspMyFirstStoredProcedure, если он уже существует.
Первые два оператора в следующем блоке кода — это операторы CREATE PROC и EXEC, которые могут создавать новую копию хранимой процедуры и запускать uspMyFirstStoredProcedure. Поскольку весь код представлен в виде одного блока, требуются три ключевых слова GO, которые не потребовались бы, если бы весь блок кода был сегментирован на четыре отдельных блока кода:
- Начальный оператор CREATE PROC должен сопровождаться ключевым словом GO, чтобы оператор CREATE PROC завершился перед первым оператором EXEC.
- Затем начальный оператор EXEC должен сопровождаться ключевым словом GO, чтобы оператор ALTER PROC был первым оператором в его пакете.
- Наконец, за оператором ALTER PROC должно следовать ключевое слово GO, чтобы оператор ALTER PROC завершился до последнего оператора EXEC.
Оператор ALTER PROC состоит из трех частей:
- Имя объекта после ALTER PROC должно совпадать с именем существующей хранимой процедуры, которую вы хотите изменить.
- Ключевое слово as действует как разделитель, отделяющий объявления ALTER PROC от нового кода T-SQL, определяющего измененную версию хранимой процедуры.
- Новый код внутри оператора ALTER PROC соединяет таблицу Person из схемы Person с таблицей Employee из схемы HumanResources в базе данных AdventureWorks2014.
-- create a new stored proc create proc dbo.uspMyFirstStoredProcedure as select * from AdventureWorks2014. HumanResources.Employee go -- run stored proc exec dbo.uspMyFirstStoredProcedure go -- alter stored proc alter proc dbo.uspMyFirstStoredProcedure as select Employee.BusinessEntityID ,Person.FirstName ,Person.LastName ,Employee.JobTitle from AdventureWorks2014.HumanResources.Employee inner join AdventureWorks2014.Person.Person on Employee.BusinessEntityID = Person.BusinessEntityID go -- run altered stored proc exec dbo.uspMyFirstStoredProcedure
Вот результат выполнения оператора EXEC в предыдущем сценарии:
- Столбцы BusinessEntityID и JobTitle взяты из таблицы Employee.
- Столбцы FirstName и LastName взяты из таблицы Person.
Помимо очевидной разницы между созданием новой хранимой процедуры и изменением существующей хранимой процедуры, оператор ALTER PROC отличается от оператора CREATE PROC другими важными особенностями. Например, оператор ALTER PROC сохраняет все параметры безопасности, связанные с существующей сохраненной процедурой, в то время, как оператор CREATE PROC не сохраняет эти параметры. Таким образом, оператор ALTER PROC подойдет лучше, чем оператор CREATE PROC, если все, что нужно сделать, это изменить код в существующей хранимой процедуре.
Начиная с SQL Server 2016 SP1, Microsoft представила новую инструкцию CREATE или ALTER для модулей кода, таких как хранимые процедуры, представления и определяемые пользователем функции. Вы можете получить представление о функциональности этого нового оператора из предыдущей статьи MSSQLTips.com.
Входные параметры хранимой процедуры SQL Server
Входной параметр позволяет разработчику изменять способ работы хранимой процедуры во время выполнения. Обычно входной параметр в предложении where оператора SELECT используется для управления строками, отображаемыми при запуске хранимой процедуры. Можно заглянуть на страницу руководства MSSQLTips.com для демонстрации того, как использовать входные параметры в предложении where.
Вот простой пример, основанный на изменении uspMyFirstStoredProcedure, который демонстрирует использование входного параметра.
Входной параметр с именем @jobtitle назван непосредственно перед ключевым словом as.
На входной параметр имеется ссылка в предложении where оператора SELECT.
Оператор EXEC, который следует за оператором ALTER PROC, присваивает значение входному параметру @jobtitle во время выполнения. Значением параметра является строка nvarchar («Production Supervisor»).
-- alter a stored proc-- this alteration has one select statement with a where clause -- and a criterion set by an input parameter -- and an input parameter alter proc dbo.uspMyFirstStoredProcedure @jobtitle nvarchar(50) as select Employee.BusinessEntityID ,Person.FirstName ,Person.LastName ,Employee.JobTitle from AdventureWorks2014.HumanResources.Employee inner join AdventureWorks2014.Person.Person on Employee.BusinessEntityID = Person.BusinessEntityID where Employee.JobTitle like @jobtitle + '%' go -- run altered stored proc with -- @jobtitle parameter value is passed without naming the parameter exec uspMyFirstStoredProcedure N'Production Supervisor'
Вот вкладка «Results«, на которой показаны выходные данные оператора SELECT внутри uspMyFirstStoredProcedure. На вкладке показан 21 сотрудник, чьи должности начинаются с «Production Supervisor». Вы можете изменить содержимое вкладки «Results», используя другое строковое значение в операторе EXEC.
Параметры вывода хранимых процедур SQL Server
Выходной параметр передает скалярное значение из хранимой процедуры в вызывающую ее инструкцию EXEC. Некоторое предыдущее освещение этой темы можно найти на этой странице руководства. Кроме того, в последующих статьях этой серии по хранимым процедурам будут представлены многочисленные подробные примеры, демонстрирующие, как программировать входные параметры, выходные параметры и значения кода возврата с помощью хранимых процедур.
Если вы просто хотите передать одно значение, такое как сумма или количество, из хранимой процедуры, вы можете сделать это с помощью выходного параметра. Следующий оператор ALTER PROC иллюстрирует один из способов реализации такого рода задач.
В нашем примере оператор ALTER PROC снова изменяет uspMyFirstStoredProcedure.
Входной параметр @jobtitle из предыдущей версии хранимой процедуры сохраняется.
Кроме того, перед ключевым словом as добавляется спецификация выходного параметра:
- Имя выходного параметра — @jobtitlecount.
- Тип данных для параметра — int, потому что он предназначен для хранения значения счетчика, но вы также можете использовать bigint в качестве типа данных, если это необходимо.
- Ключевое слово out завершает спецификацию параметра, чтобы указать, что этот параметр возвращает значение после запуска хранимой процедуры.
Оператор SELECT состоит из вложенного внутреннего оператора выбора внутри внешнего операторе выбора:
- Оператор внутреннего выбора возвращает строку для каждого сотрудника, JobTitle которого начинается со значения входного параметра.
- Внешний оператор select подсчитывает количество строк, возвращаемых внутренним оператором select, и присваивает счет выходному параметру @jobtitlecount.
-- alter a stored proc -- this alteration computes an aggregate function value -- based, in part, on an input parameter (@jobtitle) -- and saves the computed value in an output parameter (@jobtitlecount) alter proc dbo. uspMyFirstStoredProcedure @jobtitle nvarchar(50), @jobtitlecount int out as select @jobtitlecount = count(*) from AdventureWorks2014.HumanResources.Employee inner join AdventureWorks2014.Person.Person on Employee.BusinessEntityID = Person.BusinessEntityID where Employee.JobTitle like @jobtitle + '%'
После выполнения оператора ALTER PROC можно вызвать недавно измененную версию uspMyFirstStoredProcedure и отобразить значение выходного параметра. Следующий сценарий показывает, как этого добиться.
Перед вызовом инструкции EXEC для запуска uspMyFirstStoredProcedure объявите локальную переменную @jobtitlecount для получения значения выходного параметра из хранимой процедуры.
- Значение параметра вывода появляется в операторе EXEC с завершающим ключевым словом вывода OUTPUT. Это ключевое слово указывает, что значение параметра передается из хранимой процедуры в инструкцию EXEC.
- Оператор присваивания (=) передает значение выходного параметра в локальную переменную @jobtitlecount.
Оператор SELECT после оператора EXEC отображает значение локальной переменной @jobtitlecount, которая получила значение выходного параметра.
-- run an altered stored proc with -- @jobtitle input parameter value and -- save the returned output parameter in a local variable declare @jobtitlecount int exec uspMyFirstStoredProcedure N'Production Supervisor',@jobtitlecount = @jobtitlecount OUTPUT select @jobtitlecount [Job Title Count]
Значения кода возврата хранимой процедуры SQL Server
Хранимые процедуры могут иметь значения кода возврата, которые всегда имеют тип данных int.
Далее приведём сценарий для установки нулевого или единичного кода возврата внутри хранимой процедуры. Если в столбце существует критерий строки поиска, основанный на входном параметре, то возвращаемое значение устанавливается равным единице. В противном случае возвращаемое значение устанавливается равным нулю.
- Входной параметр имеет имя @jobtitle.
- Критерий предложения where в операторе SELECT: Employee.JobTitle, например ‘%’ + @jobtitle + ‘%’.
- Когда инструкция SELECT с предложением where возвращает хотя бы одну строку, возвращаемое значение устанавливается равным единице. В противном случае возвращаемое значение устанавливается равным нулю.
- Условие EXISTS определяет, будет ли возвращена хотя бы одна строка из оператора SELECT.
- Предложение return возвращает значение кода возврата и завершает хранимую процедуру.
-- alter a stored proc -- this alteration verifies if a search string value -- is in a set of column values -- @jobtitle input parameter contains the search string value -- JobTitle is the column of values searched alter proc dbo.uspMyFirstStoredProcedure @jobtitle nvarchar(50) as -- does at least one JobTitle contain @jobtitle? if exists( select top 1 Employee.JobTitle from AdventureWorks2014.HumanResources.Employee inner join AdventureWorks2014. Person.Person on Employee.BusinessEntityID = Person.BusinessEntityID where Employee.JobTitle like '%' + @jobtitle + '%' ) begin return(1) end else begin return(0) end
Следующий сценарий демонстрирует синтаксис для сбора значения кода возврата из хранимой процедуры и показывает некоторый образец кода для обработки значения кода возврата. Скрипт вызывает uspMyFirstStoredProcedure для двух разных значений @jobtitle — sals или sales. Ни одно значение столбца JobTitle не содержит sals, но хотя бы одно значение JobTitle содержит sales.
Сначала в коде объявляются две локальные переменные с именами @jobtitle и @exists.
Локальная переменная @jobtitle используется в инструкции EXEC для передачи строки поиска в uspMyFirstStoredProcedure.
Локальная переменная @exists используется для сбора значения кода возврата из uspMyFirstStoredProcedure. Оператор присваивания внутри оператора EXEC заполняет локальную переменную @exists значением кода возврата.
Оператор потока управления if … else после оператора EXEC обрабатывает возвращаемое значение из хранимой процедуры.
- Если @exists равно нулю, инструкция SELECT сообщает, что нет JobTitle со значением строки поиска во входном параметре.
- Если @exists равно единице, оператор SELECT сообщает, что существует по крайней мере одно значение JobTitle с входным параметром.
Ниже, хранимая процедура выполняется дважды. Первоначальное выполнение предназначено для поисковой строки со значением sals. Второе выполнение — для значения sales в строке поиска.
-- run an altered stored proc with -- @jobtitle is an input parameter -- @exists equals 1 for at least 1 JobTitle containing @jobTitle -- @exists equals 0 for no JobTitle containing @jobtitle declare @jobtitle nvarchar(50), @exists int set @jobtitle = 'sals' exec @exists = uspMyFirstStoredProcedure @jobtitle if @exists = 0 begin select 'No JobTitle values with ' + @jobtitle [search outcome] end else begin select 'At least one JobTitle value with ' + @jobtitle [search outcome] end set @jobtitle = 'sales' exec @exists = uspMyFirstStoredProcedure @jobtitle if @exists = 0 begin select 'No JobTitle values with ' + @jobtitle [search outcome] end else begin select 'At least one JobTitle value with ' + @jobtitle [search outcome] end
Вот результат предыдущего скрипта. Вы можете использовать его для подтверждения работы кода, чтобы оценить, содержит ли хотя бы одно значение в столбце строку поиска.
Несколько наборов результатов из хранимой процедуры SQL Server
Следующий сценарий снова демонстрирует, как использовать входной параметр в операторе ALTER PROC. Имя входного параметра перед ключевым словом as — @jobtitle. Эта демонстрация отличается тем, что включает в себя два отдельных оператора SELECT. Первый оператор SELECT возвращает набор результатов, состоящий из всех строк, JobTitle которых начинается со значения входного параметра. Вторая инструкция SELECT возвращает скалярное значение, которое представляет собой количество сотрудников в таблице Employee, JobTitle которых начинается со значения входного параметра.
Оператор EXEC после оператора ALTER PROC вызывает uspMyFirstStoredProcedure. Литеральное строковое значение nvarchar («Production Supervisor») после имени хранимой процедуры является значением входного параметра.
-- alter a stored proc-- this alteration has two select statements -- and an input parameter alter proc dbo.uspMyFirstStoredProcedure @jobtitle nvarchar(50) as -- 1st select statement returns a set of row values select Employee.BusinessEntityID ,Person.FirstName ,Person.LastName ,Employee.JobTitle from AdventureWorks2014.HumanResources.Employee inner join AdventureWorks2014.Person.Person on Employee.BusinessEntityID = Person.BusinessEntityID where Employee.JobTitle like @jobtitle + '%' -- 2nd select statement returns a scalar value select count(*) as JobTitleCount from AdventureWorks2014.HumanResources.Employee inner join AdventureWorks2014.Person.Person on Employee.BusinessEntityID = Person.BusinessEntityID where Employee.JobTitle like @jobtitle + '%'
Вот короткий сценарий для вызова предыдущей хранимой процедуры.
-- run altered stored proc -- @jobtitle parameter value is passed without naming the parameter exec dbo.uspMyFirstStoredProcedure N'Production Supervisor'
Вот вкладка «Results», на которой показаны выходные данные двух операторов SELECT внутри хранимой процедуры с именем uspMyFirstStoredProcedure.
На верхней панели отображается двадцать один сотрудник, чьи должности начинаются с «Production Supervisor».
На нижней панели отображается скалярное значение с количеством сотрудников, чьи должности начинаются с «Production Supervisor».
Как вы понимаете, можно изменить содержимое вкладки «Результаты», используя другое буквальное строковое значение в операторе EXEC.
Хранимые процедуры SQL: создание и использование
Хранимые процедуры SQL представляют собой исполняемый программный модуль, который может храниться в базе данных в виде различных объектов. Другими словами, это объект, в котором содержатся SQL-инструкции. Эти хранимые процедуры могут быть выполнены в клиенте прикладных программ, чтобы получить хорошую производительность. Кроме того, такие объекты нередко вызываются из других сценариев или даже из какого-либо другого раздела.
Введение
Многие считают, что они похожи на процедуры различных языков программирования высокого уровня (соответственно, кроме MS SQL). Пожалуй, это действительно так. У них есть схожие параметры, они могут выдавать схожие значения. Более того, в ряде случаев они соприкасаются. Например, они сочетаются с базами данных DDL и DML, а также с функциями пользователя (кодовое название – UDF).
В действительности же хранимые процедуры SQL обладают широким спектром преимуществ, которые выделяют их среди подобных процессов. Безопасность, вариативность программирования, продуктивность – все это привлекает пользователей, работающих с базами данных, все больше и больше. Пик популярности процедур пришелся на 2005-2010 годы, когда вышла программа от «Майкрософт» под названием «SQL Server Management Studio». С ее помощью работать с базами данных стало гораздо проще, практичнее и удобнее. Из года в год такой способ передачи информации набирал популярность в среде программистов. Сегодня же MS SQL Server является абсолютно привычной программой, которая для пользователей, «общающихся» с базами данных, встала наравне с «Экселем».
При вызове процедуры она моментально обрабатывается самим сервером без лишних процессов и вмешательства пользователя. После этого можно осуществлять любые действия с информацией: удаление, исполнение, изменение. За все это отвечает DDL-оператор, который в одиночку совершает сложнейшие действия по обработке объектов. Причем все это происходит очень быстро, а сервер фактически не нагружается. Такая скорость и производительность позволяют очень быстро передавать большие объемы информации от пользователя на сервер и наоборот.
Для реализации данной технологии работы с информацией существует несколько языков программирования. К ним можно отнести, например, PL/SQL от системы управления базами данных Oracle, PSQL в системах InterBase и Firebird, а также классический «майкрософтовский» Transact-SQL. Все они предназначены для создания и выполнения хранимых процедур, что позволяет в крупных обработчиках баз использовать собственные алгоритмы. Это нужно и для того, чтобы те, кто осуществляет управление такой информацией, могли защитить все объекты от несанкционированного доступа сторонних лиц и, соответственно, создания, изменения или удаления тех или иных данных.
Продуктивность
Эти объекты баз данных могут быть запрограммированы различными путями. Это позволяет пользователям выбирать тип используемого способа, который будет наиболее подходящим, что экономит силы и время. Кроме того, процедура сама обрабатывается, что позволяет избежать огромных временных затрат на обмен между сервером и пользователем. Также модуль можно перепрограммировать и изменить в нужное направление в абсолютно любой момент. Особенно стоит отметить скорость, с которой происходит запуск хранимой процедуры SQL: это процесс происходит быстрее иных, схожих с ним, что делает его удобным и универсальным.
Безопасность
Такой тип обработки информации отличается от схожих процессов тем, что он гарантирует повышенную безопасность. Это обеспечивается за счет того, что доступ других пользователей к процедурам может быть исключен целиком и полностью. Это позволит администратору проводить операции с ними самостоятельно, не опасаясь за перехват информации или несанкционированный доступ к базе данных.
Передача данных
Связь между хранимой процедурой SQL и клиентским приложением заключается в использовании параметров и возвращаемых значениях. Последним не обязательно передавать данные в хранимую процедуру, однако эта информация (в основном по запросу пользователя) и перерабатывается для SQL. После того как хранимая процедура завершила свою работу, она отсылает пакеты данных обратно (но, опять же, по желанию) к вызвавшему его приложению, используя различные методы, с помощью которых может быть осуществлен как вызов хранимой процедуры SQL, так и возврат, например:
— передача данных с помощью параметра типа Output;
— передача данных с помощью оператора возврата;
— передача данных с помощью оператора выбора.
А теперь разберемся, как же выглядит этот процесс изнутри.
1. Создание EXEC-хранимой процедуры в SQL
Вы можете создать процедуру в MS SQL (Managment Studio). После того как создастся процедура, она будет перечислена в программируемый узел базы данных, в которой процедура создания выполняется оператором. Для выполнения хранимые процедуры SQL используют EXEC-процесс, который содержит имя самого объекта.
При создании процедуры ее название появляется первым, после чего производится один или несколько параметров, присвоенных ему. Параметры могут быть необязательными. После того как параметр(ы), то есть тело процедуры, будут написаны, нужно провести некоторые необходимые операции.
Дело в том, что тело может иметь локальные переменные, расположенные в ней, и эти переменные являются локальными также по отношению к процедурам. Другими словами, их можно рассматривать только внутри тела процедуры Microsoft SQL Server. Хранимые процедуры в таком случае считаются локальными.
Таким образом, чтобы создать процедуру, нам нужно имя процедуры и, по меньшей мере, один параметр в качестве тела процедуры. Обратите внимание, что отличным вариантом в таком случае является создание и выполнение процедуры с именем схемы в классификаторе.
Тело процедуры может иметь любой вид из операторов SQL, например, такие как создание таблицы, вставки одного или нескольких строк таблицы, установление типа и характера базы данных и так далее. Тем не менее тело процедуры ограничивает выполнение некоторых операций в нем. Некоторые из важных ограничений перечислены ниже:
— тело не должно создавать какой-либо другой хранимой процедуры;
— тело не должно создать ложное представление об объекте;
— тело не должно создавать никаких триггеров.
2. Установка переменной в тело процедуры
Вы можете сделать переменные локальными для тела процедуры, и тогда они будут находиться исключительно внутри тела процедуры. Хорошей практикой является создание переменных в начале тела хранимой процедуры. Но также вы можете устанавливать переменные в любом месте в теле данного объекта.
Иногда можно заметить, что несколько переменных установлены в одной строке, и каждый переменный параметр отделяется запятой. Также обратите внимание, что переменная имеет префикс @. В теле процедуры вы можете установить переменную, куда вы хотите. К примеру, переменная @NAME1 может объявлена ближе к концу тела процедуры. Для того чтобы присвоить значение объявленной переменной используется набор личных данных. В отличие от ситуации, когда объявлено более одной переменной в одной строке, в такой ситуации используется только один набор личных данных.
Часто пользователи задают вопрос: «Как назначить несколько значений в одном операторе в теле процедуры?» Что ж. Вопрос интересный, но сделать это гораздо проще, чем вы думаете. Ответ: с помощью таких пар, как «Select Var = значение». Вы можете использовать эти пары, разделяя их запятой.
3. Создание хранимой процедуры SQL
В самых различных примерах люди показывают создание простой хранимой процедуры и выполнение ее. Однако процедура может принимать такие параметры, что вызывающий ее процесс будет иметь значения, близкие к нему (но не всегда). Если они совпадают, то внутри тела начинаются соответствующие процессы. Например, если создать процедуру, которая будет принимать город и регион от вызывающего абонента и возвращать данные о том, сколько авторов относятся к соответствующим городу и региону. Процедура будет запрашивать таблицы авторов базы данных, к примеру, Pubs, для выполнения этого подсчета авторов. Чтобы получить эти базы данных, к примеру, Google загружает сценарий SQL со страницы SQL2005.
В предыдущем примере процедура принимает два параметра, которые на английском языке условно будут называться @State и @City. Тип данных соответствует типу, определенному в приложении. Тело процедуры имеет внутренние переменные @TotalAuthors (всего авторов), и эта переменная используется для отображения их количества. Далее появляется раздел выбора запроса, который все подсчитывает. Наконец, подсчитанное значение выводится в окне вывода с помощью оператора печати.
Как в SQL выполнить хранимую процедуру
Есть два способа выполнения процедуры. Первый путь показывает, передавая параметры, как разделенный запятыми список выполняется после имени процедуры. Допустим, мы имеем два значения (как в предыдущем примере). Эти значения собираются с помощью переменных параметров процедуры @State и @City. В этом способе передачи параметров важен порядок. Такой метод называется порядковая передача аргументов. Во втором способе параметры уже непосредственно назначены, и в этом случае порядок не важен. Этот второй метод известен как передача именованных аргументов.
Процедура может несколько отклоняться от типичной. Все так же, как и в предыдущем примере, но только здесь параметры сдвигаются. То есть параметр @City хранится первым, а @State хранится рядом со значением по умолчанию. Параметр по умолчанию выделяется обычно отдельно. Хранимые процедуры SQL проходят как просто параметры. В этом случае, при условии, параметр «UT» заменяет значение по умолчанию «СА». Во втором исполнении проходит только одно значение аргумента для параметра @City, и параметр @State принимает значение по умолчанию «СА». Опытные программисты советуют, чтобы все переменные по умолчанию располагались ближе к концу списка параметров. В противном случае исполнение не представляется возможным, и тогда вы должны работать с передачей именованных аргументов, что дольше и сложнее.
4. Хранимые процедуры SQL Server: способы возврата
Существует три важных способа отправки данных в вызванной хранимой процедуре. Они перечислены ниже:
— возврат значения хранимой процедуры;
— выход параметра хранимых процедур;
— выбор одной из хранимых процедур.
4.1 Возврат значений хранимых процедур SQL
В этой методике процедура присваивает значение локальной переменной и возвращает его. Процедура может также непосредственно возвращать постоянное значение. В следующем примере, мы создали процедуру, которая возвращает общее число авторов. Если сравнить эту процедуру с предыдущими, вы можете увидеть, что значение для печати заменяется обратным.
Теперь давайте посмотрим, как выполнить процедуру и вывести значение, возвращаемое ей. Выполнение процедуры требует установления переменной и печати, которая проводится после всего этого процесса. Обратите внимание, что вместо оператора печати вы можете использовать Select-оператор, например, Select @RetValue, а также OutputValue.
4.2 Выход параметра хранимых процедур SQL
Ответное значение может быть использовано для возврата одной переменной, что мы и видели в предыдущем примере. Использование параметра Output позволяет процедуре отправить одно или несколько значений переменных для вызывающей стороны. Выходной параметр обозначается как раз-таки этим ключевым словом «Output» при создании процедуры. Если параметр задан в качестве выходного параметра, то объект процедуры должен присвоить ему значение. Хранимые процедуры SQL, примеры которых можно увидеть ниже, в таком случае возвращаются с итоговой информацией.
В нашем примере будет два выходных имени: @TotalAuthors и @TotalNoContract. Они указываются в списке параметров. Эти переменные присваивают значения внутри тела процедуры. Когда мы используем выходные параметры, вызывающий абонент может видеть значение, установленное внутри тела процедуры.
Кроме того, в предыдущем сценарии две переменные объявляются, чтобы увидеть значения, которые установливают хранимые процедуры MS SQL Server в выходном параметре. Тогда процедура выполняется путем подачи нормального значения параметра «CA». Следующие параметры являются выходными и, следовательно, объявленные переменные передаются в установленном порядке. Обратите внимание, что при прохождении переменных выходное ключевое слово также задается здесь. После того, как процедура выполнена успешно, значения, возвращаемые с помощью выходных параметров, выводятся на окно сообщений.
4.3 Выбор одной из хранимых процедур SQL
Эта техника используется для возврата набора значений в виде таблицы данных (RecordSet) к вызывающей хранимой процедуре. В этом примере SQL хранимая процедура с параметрами @AuthID запрашивает таблицу «Авторы» путем фильтрации возвращаемых записей с помощью этого параметра @AuthId. Оператор Select решает, что должно быть возвращено вызывающему хранимой процедуры. При выполнении хранимой процедуры AuthId передается обратно. Такая процедура здесь всегда возвращает только одну запись или же вообще ни одной. Но хранимая процедура не имеет каких-либо ограничений на возвращение более одной записи. Нередко можно встретить примеры, в которых возвращение данных с использованием избранных параметров с участием вычисленных переменных происходит путем предоставления нескольких итоговых значений.
В заключение
Хранимая процедура является довольно серьезным программным модулем, возвращающим или передающим, а также устанавливающим необходимые переменные благодаря клиентскому приложению. Поскольку хранимая процедура выполняется на сервере сама, обмена данными в огромных объемах между сервером и клиентским приложением (для некоторых вычислений) можно избежать. Это позволяет снижать нагрузки на сервера SQL, что, конечно же, идет на руку их держателям. Одним из подвидов являются хранимые процедуры T SQL, однако их изучение необходимо тем, кто занимается созданием внушительных баз данных. Также существует большое, даже огромное количество нюансов, которые могут быть полезны при изучении хранимых процедур, однако это нужно больше для тех, кто планирует плотно заняться программированием, в том числе профессионально.
Хранимые функции. За и против / Хабр
Использование хранимых функций СУБД для реализации бизнес-логики или её части, всегда было камнем преткновения. С одной стороны баррикад DBA и программисты БД, с другой — разработчики backend.
Рискну навлечь на себя гнев из обоих лагерей, но всё же просуммирую плюсы и минусы и изложу свои соображения о том, когда стоит писать код в хранимых функциях, а когда следует выносить наружу.
Начнём с аргументов против:
Размазывание бизнес-логики
Это, на самом деле не проблема СУБД и ХФ, как инструмента — это проблема их неверного использования. У программиста бд может возникнуть желание описать всю логику реализуемого действия в хранимой функции — действительно, ведь все данные вот они, под рукой. Если программист поддастся на искушение, а его руководитель не возразит, в будущем могут возникнуть проблемы с узостью интерфейса со внешней системой (например, с сервером приложений) — придётся добавлять новые параметры, усложнять логику и т.п. Это даже может привести к тому, что появятся «дублирующие» ХФ со слегка иным функционалом.
Скудность языка СУБД
Есть такое дело. Традиционные языки для написания ХФ pl/sql, t-sql, pl/pgsql довольно примитивны по сравнению с современными языками общего назначения. Стоит заметить, что есть возможность писать ХФ и на более продвинутых языках, например Java в Oracle или Python в postgresql.
Непереносимость хранимых функций
Имеется в виду несовместимость диалектов процедурных языков разных СУБД. Многоплатформенность как раз на уровне — благодаря поддержке разных ОС и архитектур в самих СУБД и независимости встроенных языков от внешней платформы. Здесь опять решение зависит от специфики проекта. Если проект тиражируемый, причём вы не контролируете платформу (классический пример — CMS), то переносимость вам необходима и использование ХФ — только добавит головной боли. Если же проект уникальный, либо внедрения будут происходить унифицировано (например в разных филиалах одной компании), то про непереносимость между разными СУБД можно забыть.
Отсутствие необходимых навыков у команды и высокая «стоимость» соответствующих специалистов
Это, на мой взгляд, самый серьёзный аргумент против использования ХФ. Тут всё зависит от масштабов проекта. Грубо говоря, использование хранимого кода на стороне СУБД оправдано в средних-крупных enterprise проектах. Если проект помельче — овчинка выделки не стоит. Если проект огромный сверхнагруженный, то архитектура с ХФ и РСУБД упрётся в проблемы масштабирования — тут необходимо использование специфического хранилища и подхода к обработке данных.
Теперь плюсы:
Скорость
При обработке даже небольших объёмов данных во внешнем приложении мы тратим дополнительное время на передачу по сети и преобразование данных в нужный нам формат. К тому же в СУБД уже встроены, отлажены и протестированы близкие к оптимальным алгоритмы обработки данных, вашим программистам незачем практиковаться в изобретении велосипедов.
Сокрытие структуры данных
С ростом и эволюцией программной системы схема данных может и должна меняться. Хорошо спроектированный программный интерфейс на ХФ позволит менять схему данных не изменяя код внешних приложений (которых может быть несколько). Отсюда органично вытекает и разделение ролей разработчиков, которые работают с БД и знают её структуру, и разработчиков внешних приложений, которые должны знать лишь предоставляемый API. При использовании динамического SQL на стороне приложения, для подобного разделения вводятся дополнительные слои программных абстракций БД, различные ORM.
Гибкое управление правами доступа
Хорошей практикой является ограничение пользователя, под которым «ходит» в базу клиентское приложение в правах таким образом, что он не имеет прав на чтение и изменение никаких объектов. Лишь выполняет разрешённые ему функции. Таким образом можно жёстко контролировать какие действия доступны клиенту, уменьшается вероятность нарушения целостности данных из-за ошибки клиентского приложения.
Меньшая вероятность SQL injection
При использовании динамического SQL со стороны клиентской программы, клиентская программа передаёт СУБД SQL команды в виде строк, предварительно формируемых в коде. При формировании этих строк программисту нужно быть предельно внимательным, чтобы не допустить возможности непредусмотренной модификации SQL команды. При использовании ХФ SQL код на стороне приложения обычно статический, и выглядит, как простой вызов ХФ, параметры которой передаются не строками, а через placeholders (:variable) через механизм binding. Конечно это не исключает возможность SQL injection полностью (ведь можно умудриться в ХФ конкатенировать строку, переданную параметром с текстом динамически выполняемого SQL запроса), но значительно уменьшает её вероятность.
Повторное использование SQL
Реализуя логику работы с данными в хранимом слое мы получаем привычную нам иерархическую модель повторного использования SQL кода.
При использовании динамического SQL повторное использование запросов затруднено.
Например пусть есть система A на базе ХФ и система Б на базе динамического SQL. В обеих системах есть функция получения цены товара get_price. В случае A — это хранимая функция или отображение (view), в случае Б, допустим, процедура на java, через JDBC выполняющая SQL запрос. Есть задача — получить общую стоимость товара на складе. В случае A мы джоиним get_price прямо в запрос, получающий список товаров на складе (в случае, если get_price — view или ХФ на SQL, как например в PostgreSQL, то оптимизатор разворачивает запрос inline — тем самым получается один запрос, который быстро находит сумму).
В случае B есть два варианта — либо пробежать по курсору с выборкой товаров на складе и n раз вызвать get_price (а это значит что вся выборка должна передаться по сети на клиент) либо забыть про повторное использование и написать подзапрос, дублирующий тот, что был уже написан в get_price. Оба варианта — плохие.
Простая отладка SQL
Упрощается отладка (по сравнению с разнородной процедурой внешний код+sql)
В системах с динамическим SQL (любые ORM) даже простая задача поиска проблемного куска SQL может оказаться сложной.
Семантическая и синтаксическая проверка SQL на этапе компиляции.
Возможность профилирования функций и поиска узких мест.
Возможность трассировки уже запущеной и работающей системы.
Автоматический контроль зависимостей — при изменении определения объекта инвалидируются зависимые сущности.
Когда писать бизнес-логику в БД?
Если важна скорость обработки данных
Обработка данных прямо на месте их хранения зачастую даёт значительный прирост скорости обработки. Становятся возможными такие оптимизации, как, например, агрегации на уровне хранилища данных — данные с массива даже не передаются на сервер СУБД, не говоря о клиенте.
Когда важна целостность и непротиворечивость данных
В хранимых функциях с явным управлением транзакциями и блокировками проще обеспечить целостность данных и атомарность операций. Конечно всё это может быть реализовано и снаружи, но это отдельная и большая работа.
Данные имеют сложную, но устоявшуюся структуру
Плоские и слабо взаимосвязанные структуры часто не требуют всего богатства инструментов обработки, которые предлагают СУБД. Для них можно использовать сверхбыстрые key-value хранилища и кеширование в памяти.
Сложно организованные сильно связанные иерархические и сетевые структуры — явный показатель, что ваши знания РСУБД пригодятся!
Когда выносить код наружу?
Работа с внешними данными
Если специфика системы такова, что данных, приходящих на обработку снаружи (с датчиков, из других систем) больше, чем данных, сохраняемых в БД, то многие плюсы БД, как платформы программирования теряются. Оказывается проще обработать поступающие даннные снаружи и сохранить результат в БД, чем сначала всё пихать в БД, а потом обрабатывать. Здесь соблюдается тот же принцип — обрабатывать данные как можно ближе к источнику, о котором мы говорили выше применительно обработке данных, уже хранящихся в БД.
Сложные алгоритмы
Сложные или высоко-оптимизированные алгоритмы-числодробилки лучше писать на более приспособленных для этого языках. Встроенные языки РСУБД очень мощны (в том смысле, что высокоуровневые, а не гибкие), но за счёт этого имеют высокий overhead.
Highload
В сверхвысоконагруженных системах обычные подходы к сериализации транзакций и синхронизации серверов кластера становятся узким местом. Для таких систем характерны уникальные решения под конкретные задачи, универсальные и мощные системы РСУБД часто оказываются слишком медлительными при нагрузках в сотни тысяч конкурентных транзакций в секунду.
Вывод такой, что чёткого алгоритма нет. Каждый раз решение остаётся за архитекторами и менеджером и от него зависит то, завязнет ли проект в проблемах с race conditions и неконсистентностью данных NoSQL, проблемах с производительностью и отладкой запросов ORM, или упрётся в проблемы масштабирования СУБД при использовании хранимых функций. Поэтому — принимайте верные решения 🙂
хранимых процедур SQL Server для начинающих
В этой статье мы узнаем, как создавать хранимые процедуры в SQL Server на разных примерах.
Хранимая процедура SQL Server представляет собой пакет операторов, сгруппированных в виде логической единицы и хранящихся в базе данных. Хранимая процедура принимает параметры и выполняет операторы T-SQL в процедуре, возвращает набор результатов, если таковой имеется.
Чтобы понять различия между функциями и хранимыми процедурами в SQL Server, вы можете обратиться к этой статье Функции и хранимые процедуры в SQL Server, а чтобы узнать о частичных хранимых процедурах в SQL Server, щелкните Частичные хранимые процедуры в SQL Server.
Преимущества использования хранимой процедуры
Ее можно легко изменить : Мы можем легко изменить код внутри хранимой процедуры без необходимости перезапуска или развертывания приложения. Например, если запросы T-SQL написаны в приложении и нам нужно изменить логику, мы должны изменить код в приложении и повторно развернуть его. Хранимые процедуры SQL Server устраняют такие проблемы, сохраняя код в базе данных. поэтому, когда мы хотим изменить логику внутри процедуры, мы можем просто сделать это с помощью простого оператора ALTER PROCEDURE.
Уменьшение сетевого трафика: Когда мы используем хранимые процедуры вместо написания запросов T-SQL на уровне приложения, по сети передается только имя процедуры, а не весь код T-SQL.
Многократное использование: Хранимые процедуры могут выполняться несколькими пользователями или несколькими клиентскими приложениями без необходимости повторного написания кода.
Безопасность: Хранимые процедуры уменьшают угрозу, исключая прямой доступ к таблицам. мы также можем зашифровать хранимые процедуры при их создании, чтобы исходный код внутри хранимой процедуры не был виден. Используйте сторонние инструменты, такие как ApexSQL Decrypt, для расшифровки зашифрованных хранимых процедур.
Производительность: Хранимая процедура SQL Server при первом выполнении создает план и сохраняет его в пуле буферов, чтобы этот план можно было повторно использовать при следующем выполнении.
Я создаю образцы таблиц, которые будут использоваться в примерах в этой статье.
1 2 3 4 5 6 7 8 1 30003 11 12 13 14 15 16 17 | Создание таблицы продукт (ProductId Int, ProductName VARCHAR (100)) GO Создание таблицы Продукт. (680, HL Road Frame — черный, 58 футов) , (706, HL Road Frame — красный, 58 футов) ,(707,’Шлем Sport-100, красный’) GO
ВСТАВЬТЕ В ОПИСАНИЕ ПРОДУКТА ЗНАЧЕНИЯ (680,’Сменное горное колесо для райдера начального уровня’) ,(706,’Прочный сплав имеет быстросъемную ступицу.’) ,(707,’Аэродинамические диски для плавной езды.’) GO |
Создание простой хранимой процедуры
Мы создадим простую хранимую процедуру, которая объединяет две таблицы и возвращает набор результатов, как показано в следующем примере.
1 2 3 4 5 6 7 8 10 3 9 3 | Создание процедуры GetProductDesc AS Begin SET NOCOUNT на SELECT P.ProductId, P.ProductName, Pd.ProductDescription от Product P Inner Inner ProductDescription PD на p. prduct = pd. ID продукта
КОНЕЦ |
Мы можем использовать «EXEC procedureName» для выполнения хранимых процедур. Когда мы выполняем процедуру GetProductDesc, набор результатов выглядит так, как показано ниже.
Создание хранимой процедуры с параметрами
Давайте создадим хранимую процедуру SQL Server, которая принимает входные параметры и обрабатывает записи на основе входного параметра.
Ниже приведен пример хранимой процедуры, которая принимает параметр.
1 2 3 4 5 6 7 8 10 11 12 | создать процедуру getProductDesc_withparameters (@pid int) AS BERNVE SET NOCOUNT на SELECT P.Productid, P.ProductName, PD.Productductduct0002 INNER JOIN ProductDescription PD ON P.ProductID=PD.ProductID WHERE P. ProductID=@PID
END |
EXEC GetProductDesc_withparameters 706 |
При выполнении хранимой процедуры нам нужно передать входной параметр. Пожалуйста, обратитесь к изображению ниже для набора результатов.
Создание хранимой процедуры со значениями параметров по умолчанию
Ниже приведен пример хранимой процедуры со значениями параметров по умолчанию.
1 2 3 4 5 6 7 8 10 11 12 | СОЗДАТЬ ПРОЦЕДУРУ GetProductDesc_withDefaultparameters (@PID INT =706) AS НАЧАЛО SET NOCOUNT ON
SELECT P.ProductID,P.ProductName,PD.ProductDescription FROM Product P INNER JOIN ProductDescription PD ON P.ProductID=PD.ProductID WHERE P. ProductID=@PID
END |
Когда мы выполняем описанную выше процедуру без передачи значения параметра, будет использоваться значение по умолчанию 706. Но при выполнении с передачей значения значение по умолчанию будет игнорироваться, а переданное значение будет рассматриваться как параметр.
Создание хранимой процедуры с выходным параметром
Ниже приведен пример хранимой процедуры с выходным параметром. В следующем примере извлекается EmpID, который является столбцом автоматической идентификации при вставке нового сотрудника.
CREATE TABLE Сотрудник (EmpID int identity(1,1),EmpName varchar(500)) |
1 2 3 4 5 6 7 8 10 11 12 | Создать процедуру ins_newemp_with_outputparamaters (@ename varchar (50), @eid int output) AS Начало SET NOCOUNT на Insert Intout Into Companeee (inmpname) (@ename) . ВЫБЕРИТЕ @EId= SCOPE_IDENTITY()
КОНЕЦ |
Выполнение хранимых процедур с выходными параметрами немного отличается. Мы должны объявить переменную для хранения значения, возвращаемого выходным параметром.
declare @EmpID INT
EXEC ins_NewEmp_with_outputparamaters ‘Эндрю’, @EmpID OUTPUT
SELECT @EmpID |
Создание зашифрованной хранимой процедуры
Мы можем скрыть исходный код в хранимой процедуре, создав процедуру с опцией «ШИФРОВАНИЕ».
Ниже приведен пример зашифрованной хранимой процедуры.
1 2 3 4 5 6 7 8 | СОЗДАТЬ ПРОЦЕДУРУ GetEmployees С ШИФРОВАНИЕМ AS НАЧАЛО УСТАНОВИТЬ NOCOUNT ON
ВЫБРАТЬ EmpID,EmpName от сотрудника КОНЕЦ |
Когда мы пытаемся просмотреть код хранимой процедуры SQL Server с помощью sp_helptext, он возвращает «Текст для объекта GetEmployees зашифрован».
Когда вы пытаетесь создать сценарий зашифрованной хранимой процедуры из студии управления SQL Server, возникает ошибка, как показано ниже.
Создание временной процедуры
Как и временную таблицу, мы также можем создавать временные процедуры. Существует два типа временных процедур: одна — локальная временная хранимая процедура, а другая — глобальная временная процедура.
Эти процедуры создаются в базе данных tempdb .
Локальные временные хранимые процедуры SQL Server : они создаются с префиксом # и доступны только в сеансе, в котором они были созданы. Эта процедура автоматически сбрасывается при закрытии соединения.
Ниже приведен пример создания локальной временной процедуры.
СОЗДАТЬ ПРОЦЕДУРУ #Temp AS НАЧАТЬ ПЕЧАТЬ ‘Локальная временная процедура’ КОНЕЦ |
Глобальная временная хранимая процедура SQL Server: Эти процедуры создаются с префиксом ##, и к ним также можно получить доступ в других сеансах. Эта процедура автоматически удаляется при закрытии соединения, которое использовалось для создания процедуры.
Ниже приведен пример создания глобальной временной процедуры.
СОЗДАТЬ ПРОЦЕДУРУ ##TEMP AS НАЧАТЬ ПЕЧАТЬ ‘Глобальная временная процедура’ КОНЕЦ |
Изменение хранимой процедуры
Используйте оператор ALTER PROCEDURE , чтобы изменить существующую хранимую процедуру. Ниже приведен пример изменения существующей процедуры.
1 2 3 4 5 6 7 8 10 3 9 3 | Решающая процедура getProductDesc AS BERVE SET NOCOUNT на SELECT P.ProductId, P.ProductName, Pd.ProductDescription от Product P Inner Inner ProductDescription PD на p.prduct = pd ud. ID продукта
КОНЕЦ |
Переименование хранимой процедуры
Чтобы переименовать хранимую процедуру с помощью T-SQL, используйте системную хранимую процедуру sp_rename. Ниже приведен пример, в котором процедура «GetProductDesc» переименовывается в новое имя «GetProductDesc_new».
sp_rename ‘GetProductDesc’, ‘GetProductDesc_new’ |
Заключение
В этой статье мы рассмотрели хранимые процедуры SQL Server на различных примерах. Если у вас есть какие-либо вопросы, пожалуйста, не стесняйтесь задавать их в разделе комментариев ниже. (см. все)
Хранимая процедура в SQL Server
В этой статье вы узнаете, как создать хранимую процедуру в SQL. В этой статье приведены ответы на следующие вопросы:
- Что такое хранимая процедура в SQL?
- Почему мы используем SET NOCOUNT ON в хранимой процедуре?
- Сколько существует типов хранимых процедур?
- Как писать комментарии в SQL Server?
- Каковы соглашения об именовании хранимых процедур?
- Как создать хранимую процедуру для выбора данных из вкладки базы данных с помощью SQL-запроса SELECT?
- Как выполнять хранимые процедуры в SQL Server?
- Что такое параметры в хранимых процедурах?
- Как создать параметры в хранимой процедуре запроса SELECT, которые возвращают записи в соответствии с переданным параметром?
- Как создать хранимую процедуру на основе запроса INSERT?
- Как создать хранимую процедуру на основе запроса UPDATE?
- Как создать хранимую процедуру для удаления записей с помощью запроса DELETE?
Что такое хранимая процедура?
Хранимая процедура SQL (SP) представляет собой набор операторов SQL и логики команд SQL, которые компилируются и хранятся в базе данных. Сохраненные процедуры в SQL позволяют нам создавать SQL-запросы, которые будут храниться и выполняться на сервере. Хранимые процедуры также можно кэшировать и использовать повторно. Основная цель хранимых процедур — скрыть прямые SQL-запросы от кода и повысить производительность операций с базой данных, таких как выбор, обновление и удаление данных.
Вы можете создавать и выполнять хранимые процедуры с помощью обозревателя объектов в SQL Server или с помощью SQL Server Management Studio (SSMS). Если вы новичок в SSMS, попробуйте следующее: https://www.c-sharpcorner.com/article/sql-server-management-studio/
Почему мы используем SET NOCOUNT ON в хранимой процедуре?
Хотя мы установили SET NOCOUNT ON, это означает, что нет сообщений, показывающих количество затронутых строк.
NOCOUNT означает, что значение ON не учитывается.
Теперь вы узнаете, что произошло, когда SET NOCOUNT OFF.
Типы хранимых процедур
В SQL Server доступны два типа хранимых процедур:
- Пользовательские хранимые процедуры
- Системные хранимые процедуры
Пользовательские хранимые процедуры
Определяемые пользователем хранимые процедуры создаются разработчиками баз данных или администраторами баз данных. Эти SP содержат еще один оператор SQL для выбора, обновления или удаления записей из таблиц базы данных. Определяемая пользователем хранимая процедура может принимать входные параметры и возвращать выходные параметры. Определяемая пользователем хранимая процедура представляет собой смесь команд DDL (язык определения данных) и DML (язык манипулирования данными).
Пользовательские SP далее подразделяются на два типа:
Хранимые процедуры T-SQL: T-SQL (Transact SQL) SP получают и возвращают параметры. Эти SP обрабатывают запросы на вставку, обновление и удаление с параметрами или без них и возвращают данные строк в качестве выходных данных. Это один из наиболее распространенных способов написания SP в SQL Server.
Хранимые процедуры CLR: CLR (Common Language Runtime) SP написаны на языке программирования на основе CLR, таком как C# или VB.NET, и выполняются .NET Framework.
Системные хранимые процедуры
Системные хранимые процедуры создаются и выполняются SQL Server для административных действий сервера. Разработчики обычно не вмешиваются в системные SP.
Вход в базу данных SQL Server
Давайте войдем в нашу базу данных SQL Server, чтобы получить следующее:
- Как создать хранимую процедуру на основе SELECT QUERY, которая возвращает все записи?
- Как создать хранимую процедуру SELECT QUERY на основе PARAMETER, которая возвращает записи на основе параметров?
- Как создать хранимую процедуру на основе запроса INSERT?
- Как создать хранимую процедуру на основе запроса UPDATE?
- Как создать хранимую процедуру на основе запроса DELETE?
Войдите в SQL SERVER, используя имя сервера, имя пользователя и пароль.
Переключитесь на свою базу данных. Имя моей базы данных MBKTest.
Пустая хранимая процедура будет создана с использованием следующего:
Команда SQL CREATE PROCEDURE используется для создания процедуры, за которой следует имя SP и ее параметры. Область BEGIN и END используется для определения запроса операции. Здесь вы будете писать запросы на выбор, обновление, вставку или удаление.
- — =========================================== ====
- — Шаблон, сгенерированный из Template Explorer с использованием:
- — Создать процедуру (Новое меню).SQL
- —
- — Используйте параметр «Указать значения для параметров шаблона»
- — команда (Ctrl-Shift-M) для заполнения параметра
- — значения ниже.
- —
- — Этот блок комментариев не будет включен в
- — определение процедуры.
- — ============================================== =
- УСТАНОВИТЬ ANSI_NULLS ON
- GO
- УСТАНОВИТЬ QUOTED_IDENTIFIER ON
- GO
- — ===========================================
- — Автор: <Автор,Имя>
- — Дата создания: <Дата создания,>
- — Описание: <Описание,>
- — ===========================================
- CREATE PROCEDURE
- — Добавьте сюда параметры для хранимой процедуры
- <@Param1, sysname, @p1>
= , - <@Param2, sysname, @p2>
= - КАК
- НАЧАЛО
- — SET NOCOUNT ON добавлен для предотвращения дополнительных наборов результатов из
- — вмешательство в операторы SELECT.
- УСТАНОВИТЬ NOCOUNT ON;
- — Вставьте операторы для процедуры здесь
- SELECT <@Param1, sysname, @p1>, <@Param2, sysname, @p2>
- КОНЕЦ
- GO
Как писать комментарии в SQL SERVER?
Вы можете комментировать в sql server следующими способами:
- — (два дефиса/тире) для одной строки комментария.
- начните с /* ……. заканчиваться на */ для многострочных комментариев.
Каково соглашение об именовании хранимых процедур?
Мы должны следовать стандартным соглашениям об именах, которые также могут зависеть от вашего проекта и политик кодирования.
Для пользовательских соглашений об именах хранимых процедур я предлагаю добавить один из следующих префиксов к вашим именам SP.
- сп
- стп
- стп_
- удстп
- удстп_
Соглашения об именах предназначены только для идентификации объектов. Добавляя эти префиксы в имя, мы можем четко определить, что этот объект является хранимой процедурой.
Создание таблицы базы данных
Прежде чем мы сможем создавать и выполнять любые SP, нам нужна таблица базы данных. Я создаю таблицу базы данных с именем «tblMembers», используя следующий запрос SQL, и выполняю его на сервере. Как видите, в моей таблице 4 столбца, где первый столбец является столбцом идентификаторов. После создания таблицы откройте таблицу в SSMS и добавьте некоторые данные, введя данные в таблицу вручную.
- ИСПОЛЬЗОВАТЬ [MBKTest]
- GO
- /****** Объект: Table [dbo].[tblMembers] Script Date: 18 ноября 2017, сб 18:47:55 ******/
- УСТАНОВИТЬ ANSI_NULLS ON
- GO
- УСТАНОВИТЬ QUOTED_IDENTIFIER ON
- GO
- УСТАНОВИТЬ ANSI_PADDING ON
- GO
- CREATE TABLE [dbo]. [tblMembers](
- [MemberID] [int] IDENTITY(1,1) NOT NULL,
- [MemberName] [varchar](50) NULL,
- [MemberCity] [varchar](25) NULL,
- [MemberPhone] [varchar](15) NULL
- )
- GO
- ВЫКЛЮЧИТЬ ANSI_PADDING
- GO
Как создать хранимую процедуру SELECT?
Щелкните базу данных, разверните элемент «Программируемость» и щелкните правой кнопкой мыши «Хранимые процедуры» или нажмите CTRL + N, чтобы открыть новое окно запроса. В области запроса между BEGIN и END введите оператор SELECT, чтобы выбрать записи из таблицы. См. оператор Select в приведенном ниже коде.
- УСТАНОВИТЬ ANSI_NULLS ON
- GO
- УСТАНОВИТЬ QUOTED_IDENTIFIER ON
- GO
- — ===========================================
- — Автор: Маной Калла
- — Дата создания: 18 ноября 2017
- — Описание: Вернуть всех участников
- — ===========================================
- — Имя процедуры хранения – —> stpGetAllMembers
- СОЗДАТЬ ПРОЦЕДУРУ stpGetAllMembers
- КАК
- НАЧАЛО
- — SET NOCOUNT ON добавлен для предотвращения дополнительных наборов результатов из
- — вмешательство в операторы SELECT.
- УСТАНОВИТЬ NOCOUNT ON;
- — Выберите операторы для процедуры
- Выберите * из tblMembers
- КОНЕЦ
- GO
Теперь нажмите F5 или нажмите кнопку «Выполнить», чтобы выполнить SP.
Вы должны увидеть сообщение «Команды выполнены успешно».
Теперь перейдите в раздел «Программируемость» —> «Хранимые процедуры», щелкните правой кнопкой мыши и выберите «Обновить».
На следующем изображении видно, что создается новый SP с именем stpGetAllMembers.
Выполнение хранимых процедур в SQL Server
В пользовательском интерфейсе ниже щелкните правой кнопкой мыши имя SP и выберите «Выполнить хранимую процедуру…», чтобы выполнить SP. Отсюда вы также можете изменить существующий SP.
Кроме того, вы также можете выполнить SP из окна запроса.
Чтобы запустить хранимую процедуру в SQL Server Management Studio, переключитесь в окно запроса или нажмите CTRL + N, чтобы открыть новое окно запроса, и введите следующую команду.
- Синтаксис — EXEC <имя хранимой процедуры>
- Пример — EXEC stpGetAllMembers
Теперь мы запускаем нашу хранимую процедуру с именем stpGetAllMembers. Результат выглядит следующим образом:
ВЫВОД
Что такое параметры в хранимых процедурах?
Параметры в SP используются для передачи входных значений и возврата выходных значений. Существует два типа параметров:
- Входные параметры — передача значений хранимой процедуре.
- Выходные параметры — возвращаемые значения из хранимой процедуры.
Как создать SP запроса SELECT с параметрами?
На предыдущих шагах мы создали простой SP, возвращающий все строки из таблицы. Теперь давайте создадим новый SP, который примет название города в качестве входного параметра и вернет все строки, в которых название города соответствует значению входного параметра.
Вот обновленный SP с параметром @CityName.
- УСТАНОВИТЬ ANSI_NULLS ON
- GO
- УСТАНОВИТЬ QUOTED_IDENTIFIER ON
- GO
- — ===========================================
- — Автор: Маной Калла
- — Дата создания: 20 ноября 2017
- — Описание: Возвращает записи о конкретных городах
- — ===========================================
- СОЗДАТЬ ПРОЦЕДУРУ stpGetMembersByCityName
- — Добавьте сюда параметры для хранимой процедуры
- @CityName nvarchar(30)
- КАК
- НАЧАЛО
- — SET NOCOUNT ON добавлен для предотвращения дополнительных наборов результатов из
- — вмешательство в операторы SELECT.
- УСТАНОВИТЬ NOCOUNT ON;
- Выбрать * From tblMembers
- где MemberCity как ‘%’+@CityName+’%’
- КОНЕЦ
- GO
Выполнить.
Чтобы запустить этот SP, введите следующую команду в инструменте запросов SQL:
EXEC GetMemberByCityName @CityName = ‘mal’
ИЛИ из пользовательского интерфейса запустите SP и введите следующие данные.
Выполняемый код выглядит следующим образом:
- USE [MBKTest]
- GO
- DECLARE @return_value int
- EXEC @return_value = [dbo].[GetMemberByCityName]
- @CityName = N’mal’
- SELECT ‘Возвращаемое значение’ = @return_value
- GO
ВЫВОД
Как создать хранимую процедуру на основе запроса INSERT?
Мы можем использовать SQL-запрос INSERT INTO для вставки данных в таблицу. Следующая инструкция SQL создает INSERT SP с тремя параметрами.
- УСТАНОВИТЬ ANSI_NULLS ON
- GO
- УСТАНОВИТЬ QUOTED_IDENTIFIER ON
- GO
- — ===========================================
- — Автор: Маной Калла
- — Дата создания: 20 ноября 2047
- — Описание: Чтобы создать нового участника
- — ===========================================
- СОЗДАТЬ ПРОЦЕДУРУ stpInsertMember
- @MemberName varchar(50),
- @MemberCity varchar(25),
- @MemberPhone varchar(15)
- КАК
- НАЧАЛО
- — SET NOCOUNT ON добавлен для предотвращения дополнительных наборов результатов из
- — вмешательство в операторы SELECT.
- УСТАНОВИТЬ NOCOUNT ON;
- Вставить в tblMembers (MemberName,MemberCity,MemberPhone)
- Значения (@MemberName, @MemberCity, @MemberPhone)
- КОНЕЦ
- GO
Щелкните правой кнопкой мыши хранимую процедуру в обозревателе объектов и выберите «Обновить».
Передайте значение параметра в диалоговом окне «Выполнение». Примерно так:
Следующий код можно использовать для выполнения этого SP в SSMS.
- ИСПОЛЬЗОВАНИЕ [MBKTest]
- GO
- DECLARE @return_value int
- EXEC @return_value = [dbo].[stpInsertMember]
- @MemberName = Н’Махеш Чанд’,
- @MemberCity = N’NewYork’,
- @MemberPhone = N’9999945121′
- SELECT ‘Возвращаемое значение’ = @return_value
- GO
ВЫВОД
В окне запроса можно проверить, добавлена ли в таблицу новая запись для имени участника «Махеш Чанд».
Вы также можете запустить тот же SP в коде.
EXEC stpInsertMember @MemberName = ‘Suhana & Ashish Kalla ‘, @MemberCity = ‘Mumbai ‘, @MemberPhone = N’92774xxx’
OUTPUT
You can check Запись «Сухана и Ашиш Калла» успешно добавлена.
Как создать хранимую процедуру UPDATE на основе запроса?
Давайте создадим новый SP, который будет обновлять записи таблицы на основе столбца ID участника. Идентификатор передается как входной параметр. Вот новый SP, который использует команду UPDATE..SET..WHERE.
- УСТАНОВИТЬ ANSI_NULLS ON
- GO
- УСТАНОВИТЬ QUOTED_IDENTIFIER ON
- GO
- — ===========================================
- — Автор: Маной Калла
- — Дата создания: 20 ноября 2017
- — Описание: Обновление сведений об участнике по идентификатору
- — ===========================================
- СОЗДАТЬ ПРОЦЕДУРУ stpUpdateMemberByID
- @MemberID int,
- @MemberName varchar(50),
- @MemberCity varchar(25),
- @MemberPhone varchar(15)
- КАК
- НАЧАЛО
- — SET NOCOUNT ON добавлен для предотвращения дополнительных наборов результатов из
- — вмешательство в операторы SELECT.
- УСТАНОВИТЬ NOCOUNT ON;
- ОБНОВЛЕНИЕ tblMembers
- Set MemberName = @MemberName,
- MemberCity = @MemberCity,
- MemberPhone = @MemberPhone
- Где MemberID = @MemberID
- КОНЕЦ
- GO
Щелкните правой кнопкой мыши хранимую процедуру в обозревателе объектов и выберите «Обновить». Вы увидите, что SP создан.
Теперь щелкните правой кнопкой мыши имя SP и выберите «Выполнить хранимую процедуру…». Укажите входные значения и выполните.
Мы можем использовать следующую команду в SSMS.
- ИСПОЛЬЗОВАНИЕ [MBKTest]
- GO
- DECLARE @return_value int
- EXEC @return_value = [dbo].[stpUpdateMemberByID]
- @MemberID = 20,
- @MemberName = Н’Нирупама Калла’,
- @MemberCity = N’Mumbai’,
- @MemberPhone = N’2541xxxx’
- SELECT ‘Возвращаемое значение’ = @return_value
- GO
EXEC stpUpdateMemberByID 17,’Gopal Madhavrai’,’Bikaner’,’ 564xxx’
В результатах должны отображаться обновленные значения.
Как создать хранимую процедуру на основе запроса DELETE?
Давайте создадим SP, который будет удалять записи. Новый SP использует команду DELETE и удаляет все записи, соответствующие предоставленному идентификатору участника.
- УСТАНОВИТЬ ANSI_NULLS ON
- GO
- УСТАНОВИТЬ QUOTED_IDENTIFIER ON
- GO
- — ===========================================
- — Автор: Маной Калла
- — Дата создания: 21 ноября 2017
- — Описание: Удаление участника по идентификатору участника
- — ===========================================
- СОЗДАТЬ ПРОЦЕДУРУ stpDeleteMemberByMemberID
- @MemberID целое число
- КАК
- НАЧАЛО
- — SET NOCOUNT ON добавлен для предотвращения дополнительных наборов результатов из
- — вмешательство в операторы SELECT.
- УСТАНОВИТЬ NOCOUNT ON;
- Удалить из tblMembers
- где MemberId = @MemberID
- КОНЕЦ
- GO
Выполнить.
Щелкните правой кнопкой мыши хранимые процедуры в обозревателе объектов и выберите «Обновить».
ЗАПУСК хранимой процедуры через пользовательский интерфейс
Теперь снова щелкните правой кнопкой мыши на хранимой процедуре и выберите Выполнить хранимую процедуру…
Как вы можете видеть на изображении, я прошел значение @memberid Параметр = 4.
. ВЫВОД На изображении видно, что MemberID = 4 запись успешно удалена. В этой статье мы увидели, как создавать хранимые процедуры в базе данных SQL Server для вставки, обновления и удаления записей. Настоящая сила хранимых процедур заключается в возможности передавать параметры и
хранимая процедура обрабатывает разные сделанные запросы. В этом
В этом разделе мы рассмотрим передачу значений параметров в хранимую процедуру. Точно так же, как у вас есть возможность использовать параметры с кодом SQL, вы также можете
настройте хранимые процедуры так, чтобы они принимали одно или несколько значений параметров. Все
примеры используют База данных AdventureWorks. Ниже приведен запрос, который мы хотим использовать для создания хранимой процедуры. Идея состоит в том, чтобы создать хранимую процедуру, в которой Город передается в
хранимая процедура, чтобы она могла создавать динамические результаты. Это можно сделать следующим образом, используя
Переменная. Если мы запустим приведенный ниже код, он вернет только результаты для New
Йорк. Мы могли бы использовать этот подход и продолжать обновлять переменную @City, но есть
лучший способ сделать это, создав хранимую процедуру. В этом примере мы будем запрашивать таблицу Person.Address из AdventureWorks.
базу данных, но вместо того, чтобы возвращать все записи, мы ограничим ее только определенным
город. В этом примере предполагается, что будет точное совпадение значения города. что пройдено. Чтобы вызвать эту хранимую процедуру, мы должны выполнить ее следующим образом: Если вы создали хранимую процедуру и хотите воссоздать сохраненную
процедуру с тем же именем, вы можете удалить ее, используя следующую
перед попыткой создать его снова. Если вы попытаетесь создать хранимую процедуру, а она уже существует, вы получите сообщение об ошибке. Сообщение 2714, уровень 16, состояние 3, процедура uspGetAddress, строка 1 [строка запуска пакета 33] Мы также можем сделать то же самое, но позволить пользователям дать нам отправную точку
для поиска данных. Здесь мы можем изменить «=» на НРАВИТСЯ и использовать подстановочный знак «%». Это можно выполнить следующим образом, чтобы найти все города, имена которых начинаются с «Новый». В обоих предыдущих примерах предполагается, что значение параметра всегда
пройти. Если вы попытаетесь выполнить процедуру без передачи параметра
значение вы получите сообщение об ошибке, такое как следующее: Сообщение 201, уровень 16, состояние 4, процедура uspGetAddress, строка
0 В большинстве случаев рекомендуется передавать все значения параметров,
но иногда это невозможно. Итак, в этом примере мы используем параметр NULL
чтобы позволить вам не передавать значение параметра. Если мы создадим и запустим это хранилище
процедура в том виде, в каком она есть, не возвращает никаких данных, потому что она ищет любой город.
значения, равные NULL. Если мы запустим следующее, оно будет работать, но данные не будут возвращены. Мы могли бы изменить эту хранимую процедуру и использовать функцию ISNULL, чтобы обойти
это. Таким образом, если передается значение, оно будет использоваться для сужения результата.
set, и если значение не передано, будут возвращены все записи. (Примечание: если
столбец City имеет значения NULL, эти значения не будут включены. У вас будет
добавить дополнительную логику для City IS NULL) Теперь, если мы запустим приведенную ниже команду, все данные будут возвращены из таблицы. Настроить несколько параметров очень просто. Вам просто нужно перечислить
каждый параметр и тип данных разделены запятой, как показано ниже. Чтобы выполнить это, вы можете сделать одно из следующего: В SQL Server 2016 и более поздних версиях есть возможность СОЗДАТЬ новый
хранимая процедура, если она еще не существует, или ИЗМЕНИТЬ процедуру, если она существует
существует. Ниже приведен пример синтаксиса для обновления сохраненного
процедура, в которой мы хотим вернуть только несколько столбцов вместо всех столбцов. Базы данных SQL позволяют создавать процедуры для запуска кода без повторного ввода логики. Хранимые процедуры — это одна или несколько инструкций SQL, которые выполняют какое-либо действие с базой данных. Действие может быть любым, от создания таблицы до удаления данных или извлечения данных из ваших таблиц. По сути, хранимые процедуры — это короткие программы, созданные для вашей базы данных. Если вы извлекаете данные, возвращается набор данных. Если вы просто выполняете действие, такое как INSERT, данные не возвращаются. В хранимой процедуре можно использовать любое действие SQL, даже вызов другой процедуры. Элементы хранимой процедуры Преимущество хранимой процедуры перед написанием стандартных операторов SQL заключается в том, что ваши процедуры принимают аргументы, поэтому возвращаемые данные являются динамическими. Мы использовали статические аргументы, такие как «ГДЕ состояние = ‘tx’», где значение состояния не меняется. Но что, если вы хотите создать программу, в которой вы ищете клиентов в состоянии, но хотите отправить оператор SQL состояние из своего внешнего кода? Вы можете выполнить эту задачу с помощью хранимой процедуры, которая принимает аргумент «Состояние». Следующие две таблицы используются в наших примерах. Клиент идентификатор клиента Имя Фамилия Город Состояние 321 Фрэнк Лоэ Даллас ТХ 455 Эд Томпсон Атланта Г.А. 456 Эд Томпсон Атланта Г. А. 457 Джо Смит Майами FL 458 Фрэнк Доу Даллас ТХ Заказ идентификатор заказа идентификатор клиента Всего Дата заказа 1 321 10 02.01.2014 2 455 40 02.03.2014 3 456 20 10.03.2014 Используя приведенную выше таблицу, вы можете написать хранимую процедуру, которая находит клиентов в заданном состоянии. Элементами хранимой процедуры являются переменные, используемые в качестве аргументов, и операторы внутри процедуры. Следующий код создает процедуру, которая возвращает список клиентов на основе переменной «@state». CREATE PROC GetCustomersByState ( @state varchar(2) ) AS SELECT * FROM Customer WHERE state=@state Первая часть этой команды создает хранимую процедуру. Оператор CREATE PROC требуется только при первом создании процедуры. После создания процедуры вы просто вызываете эту конкретную процедуру по имени, но мы немного остановимся на вызове процедуры. Если вы попытаетесь создать одну и ту же процедуру дважды, механизм базы данных SQL вернет ошибку. Следующая часть оператора CREATE PROC — это параметры или аргументы. В этом примере хранимая процедура принимает аргумент «@state». Символ @ говорит вам, что «@state» — это локальная переменная. Переменной присваивается тип данных varchar(2), поэтому вы можете передать этой процедуре строковое значение только из двух символов. За оператором AS следует оператор SELECT, используемый для извлечения данных. Оператор SELECT был создан ранее для запросов клиентов в Техасе. С помощью этого оператора вы можете использовать любое состояние, переданное хранимой процедуре. После запуска процедуры отображается список клиентов. Запуск хранимой процедуры После создания процедуры ее можно запустить в любое время из любой части программы. Еще одно преимущество хранимой процедуры заключается в том, что вам больше не нужно переписывать один и тот же оператор SQL. Вы просто вызываете процедуру. Откройте механизм SQL, введите следующий код в редактор и запустите его. EXEC GetCustomersByState ‘fl’ Вышеприведенный оператор сообщает обработчику SQL запустить процедуру и передает оператору «fl» в качестве аргумента. Результатом является следующий набор данных. идентификатор клиента Имя Фамилия Город Состояние 457 Джо Смит Майами FL Процедуры могут принимать более одного аргумента. Предположим, вы хотите выполнить поиск клиентов в определенном штате и городе. Вместо того, чтобы добавлять новую процедуру, вы просто хотите изменить текущую. Как и при изменении таблицы, хранимые процедуры изменяются с помощью инструкции ALTER. Следующая инструкция SQL изменяет хранимую процедуру. alter proc getcustomersbystate ( @state varchar (2), @city varchar (50) ) как Выберите * Из клиента , где состояние = @athy = @ @athrail оператор выше добавляет параметр города, который теперь принимает значение 50 символов. Затем параметр добавляется в предложение WHERE процедуры. Следующий код возвращает тот же набор данных, что и показанный ранее, но процедура принимает два параметра. EXEC GetCustomersByState ‘fl’, ‘miami’ Что делать, если вы хотите использовать ту же процедуру, но иногда вы не знаете город и просто хотите передать штат. Вы можете создать две процедуры или добавить некоторую логику в свою хранимую процедуру. Посмотрите на следующий код процедуры. ALTER PROC GetCustomersByState ( @state varchar(2), @city varchar(50) = NULL 3 IF 9city @ SELECT * FROM Customer WHERE state=@state ELSE SELECT * FROM Customer WHERE state=@state AND city=@city В описанной выше процедуре изменилось несколько условий. Первое изменение — это параметры. Установив значение в этом разделе кода процедуры, вы присваиваете параметру или переменной значение по умолчанию. В этом коде значение по умолчанию равно NULL. Далее оператор IF использует некоторую логику для запуска кода в зависимости от значения параметра @city. Если параметр имеет значение NULL, процедура запускает код без переменной @city в предложении WHERE. Если это не NULL, процедура запускает код как с переменными состояния, так и с переменными города. Теперь выполните следующую инструкцию SQL. EXEC GetCustomerByState ‘fl’ Приведенный выше оператор использует NULL для оператора и возвращает следующий набор данных. идентификатор клиента Имя Фамилия Город Состояние 457 Джо Смит Майами FL Теперь снова запустите хранимую процедуру со следующими параметрами. EXEC GetCustomerByState ‘fl’, ‘tallahassee’ Приведенный выше оператор не возвращает никаких записей, поскольку у вас нет клиента в соответствующем городе и штате. Процедуры используют любой оператор, если эти операторы имеют допустимый синтаксис SQL. Вы можете добавить оператор JOIN в свою процедуру, чтобы вернуть связанный набор данных между несколькими таблицами. Например, вам может понадобиться список клиентов с идентификатором заказа. Затем вы должны ПРИСОЕДИНИТЬСЯ к таблице клиентов к таблице заказов. Используя то же имя и код хранимой процедуры, следующий оператор SQL извлечет ваши данные. ALTER PROC GetCustomersByState ( @state varchar(2), @city varchar (50) = null ) как , если @city is null Select CustomerId, First_Name, Last_Name, OrderId от клиента C ocom state=@state ELSE SELECT CustomerId, First_name, Last_Name, OrderId FROM Customer JOIN Order o ON c.CustomerId = o.CustomerId ГДЕ state=@state AND city=@city Теперь вы можете запустите процедуру со следующим кодом. EXEC GetCustomersByState ‘fl’ Приведенный выше код теперь возвращает следующий набор данных. идентификатор клиента Имя Фамилия идентификатор заказа 456 Эд Томпсон 3 456 Эд Томпсон 3 Поскольку имеется два заказа для одного и того же идентификатора клиента, возвращается несколько строк. Вы можете удалить повторяющиеся записи, добавив ключевое слово DISTINCT. Для изменения хранимой процедуры требуется еще одна команда ALTER, которую вы можете увидеть ниже. alter proc getcustomersbystate ( @state varchar (2), @city varchar (50) = null ) как , если @city is null Select Custom Customer c JOIN Order o ON c.CustomerId = o.CustomerId WHERE state=@state ELSE SELECT DISTINCT CustomerId, First_name, Last_Name, OrderId FROM Customer ON JOIN Заказ o идентификатор клиента ГДЕ state=@state AND city=@city Удаление процедуры из базы данных В большинстве операций с базой данных вы будете изменять или добавлять процедуры. Обычно вы не удаляете процедуры, потому что если вы не уверены, что это не повлияет на ваши программы. SQL дает вам возможность удалить процедуру, но это следует делать с осторожностью, как и при удалении таблицы. После того, как процедура прошла, вам нужно восстановить ее из резервной копии, если вы передумаете. Ключевое слово DROP используется для удаления хранимой процедуры из базы данных. Всегда убедитесь, что удаление процедуры из вашей базы данных не повредит никаким системам. Это можно сделать, переименовав процедуру и тщательно протестировав ее в среде разработки и промежуточной среды. Ключевое слово DROP удаляет процедуру без предупреждения, поэтому вы не получаете никакой проверки перед ее запуском. Следующий оператор SQL показывает, как удалить процедуру. DROP PROC GetCustomeByState Готово! Процедура прошла! В этой статье рассматривается возврат записей и немного логики SQL в рамках процедуры. В хранимой процедуре можно использовать операторы INSERT, UPDATE и DELETE. Поскольку процедуры — это небольшие программы, влияющие на критическую часть вашей системы (ваши данные), всегда тщательно тестируйте свои изменения в тестовой среде. Хранимая процедура — это подпрограмма, доступная для приложений, которые обращаются к системе реляционной базы данных. При подключении к базе данных SAP Sybase ASE, Microsoft SQL Server или Teradata с помощью Tableau можно использовать хранимую процедуру для определения подключения. Для Oracle вы можете использовать табличную функцию для определения соединения. Табличные функции Oracle действуют аналогично хранимым процедурам и перечислены в разделе «Хранимые процедуры» на странице «Источник данных». При создании источника данных с использованием одного из этих типов данных доступные процедуры перечислены в разделе «Хранимые процедуры», как показано в примере Microsoft SQL Server: С левой панели перетащите процедуру на холст или дважды щелкните одну из перечисленных процедур. Если в процедуре доступны параметры, автоматически отображается диалоговое окно «Параметры». Вместо ввода значения вы можете использовать существующий параметр Таблицы или создать новый параметр Таблицы для значения: Если вы затем выставите параметр Tableau в представлении, пользователи смогут интерактивно изменить значение параметра в процедуре. Хранимые процедуры не поддерживают объединение, связывание или объединение. Они представлены в одной логической таблице на логическом уровне и не позволяют открыть холст соединения/объединения (физический уровень). Если вы используете хранимые процедуры для определения источника данных для Tableau, имейте в виду следующее: Если хранимая процедура возвращает более одного набора результатов, Tableau считывает первый и игнорирует остальные. Если хранимая процедура имеет выходные параметры, Tableau отфильтровывает хранимую процедуру. Исключаются хранимые процедуры с параметрами нескалярного типа. Заносятся в журнал столбцы наборов результатов, не соответствующие типам в Tableau (таким как varbinary, геометрия и иерархия). Если все столбцы набора результатов сопоставляются с неизвестными типами данных, Tableau отображает сообщение: «Набор результатов… не содержит столбцов, которые можно использовать.» Хранимые процедуры, которые не возвращают наборы результатов, перечислены на странице источника данных, но завершаются неудачно, если они выбраны. Если для параметра, который требуется хранимой процедуре, не указано значение, возникает ошибка. Tableau не может заранее определить, нужны ли параметры. Tableau не выполняет никакого управления транзакциями для хранимых процедур. То есть авторы хранимых процедур не должны зависеть от Tableau для запуска транзакций до вызова хранимых процедур или для их фиксации после этого. Имена столбцов должны быть уникальными для работы хранимых процедур. Если два столбца имеют одинаковое имя или если имя не указано, процедура может привести к ошибке. Если в хранимой процедуре имеется несколько запросов (например, для чтения значений из другой таблицы или для хранения временных комбинаций), каждый из запросов должен возвращать одни и те же наборы столбцов в одном и том же порядке (одинаковые имена и типы данных). Чтобы убедиться, что порядок столбцов и имена совпадают в результатах запроса, вам может потребоваться явно «InsertData: ошибка несвязанного столбца» Если в хранимой процедуре есть несколько запросов (например, на чтение значений из другой таблицы или на хранение временных комбинаций) и процедура выдает ошибку, попробуйте добавить Кроме того, для определенных баз данных действуют следующие ограничения. Следующие ограничения применяются к хранимым процедурам в базах данных Teradata. Следующие ограничения применяются к хранимым процедурам в базах данных SQL Server. Если набор результатов для хранимой процедуры содержит столбцы типа IMAGE или TEXT, хранимая процедура завершится ошибкой с сообщением об ошибке «Неверный синтаксис». Если общая ширина результирующего набора (количество байтов в каждой строке) превышает 8060, хранимая процедура завершается ошибкой. Это может произойти с очень широкими таблицами (сотни столбцов) или с таблицами, имеющими большие текстовые столбцы, предназначенные для хранения тысяч символов текста. Tableau не отображает хранимые процедуры из схемы «sys». Если пользователь не указывает значение для одного или нескольких параметров, необходимых для процедуры, Tableau отображает ошибку базы данных SQL Server в виде «Процедуре требуется значение для параметра @x, но оно не было предоставлено». Хранимые процедуры, содержащие несколько запросов, должны соответствовать рекомендациям, перечисленным в Примечаниях к хранимым процедурам (выше). Tableau Desktop не поддерживает тип данных TIME Microsoft SQL Server. Когда поля этого типа включены в хранимую процедуру в базе данных Microsoft SQL Server, Tableau Desktop не будет их импортировать. Следующие ограничения применяются к хранимым процедурам в базах данных SAP Sybase ASE (только для Windows). База данных должна иметь правильно настроенный удаленный сервер. Если пользователь не указывает значение для одного или нескольких параметров, необходимых для процедуры, Tableau отображает ошибку базы данных Sybase ASE в виде «Процедуре требуется значение для параметра @x, но оно не было предоставлено». Спросил Изменено
1 год, 6 месяцев назад Просмотрено
575k раз Что такое «хранимая процедура» и как они работают? Какова структура хранимой процедуры (каждая должна быть хранимой процедурой )? 0 Хранимые процедуры представляют собой набор операторов SQL, которые можно выполнить несколькими способами. Большинство основных DBM поддерживают хранимые процедуры; однако не все это делают. Вам нужно будет свериться со справочной документацией по вашей конкретной СУБД, чтобы узнать подробности. Поскольку я лучше всего знаком с SQL Server, я буду использовать его в качестве примеров. Синтаксис создания хранимой процедуры довольно прост: Например: Преимущество хранимых процедур заключается в том, что вы можете централизовать логику доступа к данным в одном месте, которое затем легко оптимизировать для администраторов баз данных. Хранимые процедуры также имеют преимущество в плане безопасности, поскольку вы можете предоставить хранимой процедуре права на выполнение, но пользователю не нужно будет иметь разрешения на чтение и запись в базовых таблицах. Это хороший первый шаг против SQL-инъекций. У хранимых процедур есть недостатки, в основном это обслуживание, связанное с вашей базовой операцией CRUD. Допустим, для каждой таблицы у вас есть вставка, обновление, удаление и хотя бы один выбор на основе первичного ключа, это означает, что каждая таблица будет иметь 4 процедуры. Теперь возьмите базу данных приличного размера из 400 таблиц, и у вас будет 1600 процедур! И это при условии, что у вас нет дубликатов, которые, вероятно, будут. Именно здесь использование ORM или какого-либо другого метода для автоматического создания ваших основных операций CRUD имеет массу преимуществ. 2 Хранимая процедура — это набор предварительно скомпилированных операторов SQL, которые используются для выполнения специальной задачи. Пример: Если у меня есть таблица 42436
Сначала я получаю таблицу Для запуска процедуры на SQL Server: Затем, во-вторых, я вставляю значение в таблицу сотрудников Для запуска параметризованной процедуры на SQL Server: Пример: В таблице 0 Хранимая процедура — это группа операторов SQL, созданная и сохраненная в базе данных. Хранимая процедура будет принимать входные параметры, так что одна и та же процедура может использоваться по сети несколькими клиентами, использующими разные входные данные. Хранимые процедуры уменьшат сетевой трафик и повысят производительность. Если мы изменим хранимую процедуру, все клиенты получат обновленную хранимую процедуру. Пример создания хранимой процедуры Преимущества использования хранимых процедур Хранимая процедура допускает модульное программирование. Вы можете создать процедуру один раз, сохранить ее в базе данных и вызывать ее любое количество раз в своей программе. Хранимая процедура обеспечивает более быстрое выполнение. Если операция требует большого количества повторяющегося кода SQL, хранимые процедуры могут быть быстрее. Они анализируются и оптимизируются при первом выполнении, а скомпилированная версия хранимой процедуры остается в кэше памяти для последующего использования. Это означает, что хранимую процедуру не нужно повторно анализировать и оптимизировать при каждом использовании, что приводит к значительному сокращению времени выполнения. Хранимая процедура может уменьшить сетевой трафик. Операция, требующая сотен строк кода Transact-SQL, может быть выполнена с помощью одного оператора, выполняющего код в процедуре, а не путем отправки сотен строк кода по сети. Хранимые процедуры обеспечивают лучшую безопасность ваших данных Пользователям может быть предоставлено разрешение на выполнение хранимой процедуры, даже если у них нет разрешения на непосредственное выполнение операторов процедуры. В SQL Server у нас есть разные типы хранимых процедур: Системные хранимые процедуры хранятся в базе данных master и начинаются с префикса Пример: sp_helptext [StoredProcedure_Name] Определяемые пользователем хранимые процедуры обычно хранятся в пользовательской базе данных и обычно предназначены для выполнения задач в пользовательской базе данных. При кодировании этих процедур не используйте префикс Расширенные хранимые процедуры — это процедуры, которые вызывают функции из файлов DLL. В настоящее время расширенные хранимые процедуры устарели по той причине, что было бы лучше избегать использования расширенных хранимых процедур. Как правило, хранимая процедура является «функцией SQL». У них есть: Это пример, ориентированный на T-SQL. Хранимые процедуры могут выполнять большинство операторов SQL, возвращать скалярные и табличные значения и считаются более безопасными, поскольку предотвращают атаки путем внедрения кода SQL. 0 Представьте себе такую ситуацию: ПРИМЕЧАНИЕ: Хранимая процедура в основном используется для выполнения определенных задач в базе данных. Например Хранимая процедура — это не что иное, как группа операторов SQL, скомпилированных в единый план выполнения. Пример: создание хранимой процедуры Изменить или модифицировать хранимую процедуру: Удалить или удалить хранимую процедуру: Хранимая процедура используется для извлечения данных, изменения данных и удаления данных в таблице базы данных. Вам не нужно писать целую команду SQL каждый раз, когда вы хотите вставить, обновить или удалить данные в базе данных SQL. Хранимая процедура — это предварительно скомпилированный набор из одного или нескольких операторов SQL, которые выполняют определенную задачу. Хранимая процедура должна выполняться автономно с использованием Хранимая процедура может возвращать несколько параметров Хранимая процедура может использоваться для реализации транзакции «Что такое хранимая процедура» уже ответил в других сообщениях здесь. Я опубликую один менее известный способ использования хранимой процедуры. Это Справочник по синтаксису Необязательное целое число, используемое для группировки процедур с одинаковым именем. Эти сгруппированные процедуры можно удалить вместе с помощью одного оператора DROP PROCEDURE Пример Использовать Результат Еще одна попытка Результат Msg 2730, уровень 11, состояние 1, процедура SecondTest, строка 1 [строка запуска партии 3]
Невозможно создать процедуру «SecondTest» с номером группы 2, поскольку процедура с таким же именем и номером группы 1 в настоящее время не существует в базе данных. Сначала необходимо выполнить CREATE PROCEDURE ‘SecondTest’;1. Ссылки : ВНИМАНИЕ для простого, Хранимая процедура — это Хранимые программы , Программа/функция, хранящаяся в базе данных. Каждая хранимая программа содержит тело, состоящее из оператора SQL. Этот оператор может быть составным оператором, состоящим из нескольких операторов, разделенных точкой с запятой (;). Хранимая процедура — это именованный набор операторов SQL и процедурной логики, т. е. скомпилированный, проверенный и сохраненный в базе данных сервера. Хранимая процедура обычно рассматривается как другие объекты базы данных и контролируется механизмом безопасности сервера. В СУБД хранимая процедура представляет собой набор операторов SQL с назначенным именем, которые хранятся в базе данных в скомпилированном виде, чтобы их могли использовать несколько программ. Использование хранимой процедуры может быть полезным в Предоставлении контролируемого доступа к данным (конечные пользователи могут только вводить или изменять данные, но не могут писать процедуры) Обеспечение целостности данных (данные будут вводиться последовательно) и Повышает производительность (запросы хранимой процедуры нужно написать только один раз) Хранимые процедуры в SQL Server могут принимать входные параметры и возвращать несколько значений выходных параметров; в SQL Server операторы программы хранимых процедур выполняют операции в базе данных и возвращают значение состояния вызывающей процедуре или пакету. Преимущества использования хранимых процедур в SQL Server Они позволяют модульное программирование.
Они позволяют ускорить выполнение.
Они могут уменьшить сетевой трафик.
Их можно использовать в качестве механизма безопасности. Вот пример хранимой процедуры, которая принимает параметр, выполняет запрос и возвращает результат. В частности, хранимая процедура принимает BusinessEntityID в качестве параметра и использует его для сопоставления с первичным ключом таблицы HumanResources.Employee, чтобы вернуть запрошенного сотрудника. Я узнал об этом на сайте essential. com... это очень полезно. Хранимая процедура поможет вам создать код на сервере. Вы можете передавать параметры и находить вывод. В хранимых процедурах операторы записываются только один раз и уменьшают сетевой трафик между клиентами и серверами.
Мы также можем избежать атак Sql Injection. Предисловие: В 1992 году был создан стандарт SQL92, который был популяризирован базой данных Firebase. Этот стандарт представил «Хранимую процедуру». **
Промежуточный запрос: строка (обычно объединенная программно), которая оценивается как синтаксически правильный оператор SQL, обычно генерируемый на уровне сервера (в таких языках, как PHP, Python, PERL и т. д.). Затем эти операторы передаются в базу данных.
** **
Триггер: часть кода, предназначенная для запуска в ответ на событие базы данных (обычно событие DML), часто используемое для обеспечения целостности данных.
** Лучший способ объяснить, что такое хранимая процедура, — объяснить устаревший способ выполнения логики БД (т. е. не использовать хранимую процедуру). Устаревший способ создания систем заключался в использовании «сквозного запроса» и, возможно, наличии триггеров в базе данных.
Почти каждый, кто не использует хранимые процедуры, использует вещь, называемую «сквозным запросом» С современным соглашением о хранимых процедурах триггеры стали устаревшими наряду с «сквозными запросами». Преимущества хранимых процедур: Таким образом, при создании новой системы баз данных SQL нет веских оснований для использования сквозных запросов. Также следует отметить, что хранить хранимые процедуры в устаревших системах, которые уже используют триггеры или сквозные запросы, совершенно безопасно; Это означает, что миграция с устаревших систем на хранимые процедуры очень проста, и такая миграция не требует длительного отключения системы, если вообще требуется. Хранимая процедура SQL Server с параметрами
Автор: Greg Robidoux
Обзор
Пояснение
Создание хранимой процедуры SQL с параметрами
Запрос SQL Server для преобразования в хранимую процедуру
ИСПОЛЬЗОВАТЬ AdventureWorks
ИДТИ
ВЫБРАТЬ *
ОТ Лицо.Адрес
ВПЕРЕД
ИСПОЛЬЗОВАТЬ AdventureWorks
ИДТИ
ОБЪЯВИТЬ @City nvarchar(30)
SET @City = «Нью-Йорк»
ВЫБРАТЬ *
ОТ Лицо.Адрес
ГДЕ Город = @Город
Создать хранимую процедуру SQL Server с одним параметром
ИСПОЛЬЗОВАТЬ AdventureWorks
ИДТИ
СОЗДАЙТЕ ПРОЦЕДУРУ dbo.uspGetAddress @City nvarchar(30)
В КАЧЕСТВЕ
ВЫБРАТЬ *
ОТ Лицо.Адрес
ГДЕ Город = @Город
ИДТИ
EXEC dbo.uspGetAddress @City = «Нью-Йорк»
Удаление хранимой процедуры
ИСПОЛЬЗОВАТЬ AdventureWorks
ИДТИ
ПРОЦЕДУРА УДАЛЕНИЯ dbo.uspGetAddress
В базе данных уже есть объект с именем uspGetAddress. Хранимая процедура SQL Server с параметром, использующим подстановочный знак
ИСПОЛЬЗОВАТЬ AdventureWorks
ИДТИ
СОЗДАЙТЕ ПРОЦЕДУРУ dbo.uspGetAddress @City nvarchar(30)
В КАЧЕСТВЕ
ВЫБРАТЬ *
ОТ Лицо.Адрес
ГДЕ Город НРАВИТСЯ @City + '%'
ИДТИ
EXEC dbo.uspGetAddress @City = «Новый»
Ошибка хранимой процедуры SQL Server, когда параметр не передан
EXEC dbo.uspGetAddress
Процедура или функция ‘uspGetAddress’ ожидает параметр ‘@City’, который
не поставлялся. Хранимая процедура SQL Server с использованием NULL в качестве параметра по умолчанию
ИСПОЛЬЗОВАТЬ AdventureWorks
ИДТИ
СОЗДАТЬ ПРОЦЕДУРУ dbo.uspGetAddress @City nvarchar(30) = NULL
В КАЧЕСТВЕ
ВЫБРАТЬ *
ОТ Лицо.Адрес
ГДЕ Город = @Город
ИДТИ
EXEC dbo.uspGetAddress
ИСПОЛЬЗОВАТЬ 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
ИСПОЛЬЗОВАТЬ AdventureWorks
ИДТИ
СОЗДАЙТЕ ИЛИ ИЗМЕНИТЕ ПРОЦЕДУРУ dbo.uspGetAddress @City nvarchar(30) = NULL, @AddressLine1 nvarchar(60) = NULL
В КАЧЕСТВЕ
ВЫБЕРИТЕ AddressLine1, AddressLine2, город, почтовый индекс
ОТ Лицо.Адрес
ГДЕ Город = ISNULL(@Город,Город)
AND AddressLine1 LIKE '%' + ISNULL(@AddressLine1, AddressLine1) + '%'
ИДТИ
Последнее обновление: 23. 07.2021 Использование хранимых процедур в SQL
0003
Хранимые процедуры — Tableau
CAST
, чтобы убедиться, что тип данных правильный, например CAST(Имя пользователя как VARCHAR(20))
, и явно назвать столбцы. Если хранимая процедура не соответствует этим рекомендациям, может появиться сообщение об ошибке: SET NOCOUNT ON
в начало процедуры. Это предотвращает возвращение сообщения, показывающего количество строк, затронутых инструкцией Transact-SQL, как часть набора результатов для запроса. Ограничения хранимых процедур для баз данных Teradata
Ограничения хранимых процедур для баз данных SQL Server
Ограничения хранимых процедур для баз данных SAP Sybase ASE
sql — Что такое хранимая процедура?
СОЗДАТЬ ПРОЦЕДУРУ <владелец>.<имя процедуры>
<параметр> <тип данных>
В КАЧЕСТВЕ
<Тело>
СОЗДАТЬ ПРОЦЕДУРУ Users_GetUserInfo
@логин nvarchar(30)=нуль
В КАЧЕСТВЕ
ВЫБЕРИТЕ * из [Пользователи]
ГДЕ ISNULL(@логин,логин)=логин
Сотрудник
Идентификатор сотрудника Имя Возраст Мобильный
---------------------------------------
001 Сидхесвар 25 9938885469
002 Притиш 32
Сотрудник
: Создать процедуру Сведения о сотруднике
В качестве
Начинать
Выберите * из Сотрудника
Конец
Выполнить сведения о сотруднике
--- (Сведения о сотруднике - это имя, определяемое пользователем, укажите имя по своему усмотрению)
Процедура создания employee_insert
(@EmployeeID int, @Name Varchar(30), @Age int, @Mobile int)
В качестве
Начинать
Вставить в сотрудника
Значения (@EmployeeID, @Name, @Age, @Mobile)
Конец
Выполнить employee_insert 003, 'xyz', 27, 1234567890
--(Размер параметра должен совпадать с объявленным размером столбца)
@Name Varchar(30)
Employee
размер столбца Name
должен быть varchar(30)
. СОЗДАТЬ ПРОЦЕДУРУ test_display
В КАЧЕСТВЕ
ВЫБЕРИТЕ Имя, Фамилия
ОТ tb_test;
EXEC test_display;
sp_
. Эти процедуры можно использовать для выполнения различных задач по поддержке функций SQL Server для внешних вызовов приложений в системных таблицах 9.0003 sp_
, потому что, если мы сначала используем префикс sp_
, он проверит основную базу данных, а затем дойдет до пользовательской базы данных. -- имя
СОЗДАТЬ ПРОЦЕДУРУ spGetPerson
-- параметры
СОЗДАТЬ ПРОЦЕДУРУ spGetPerson(@PersonID int)
-- тело
СОЗДАТЬ ПРОЦЕДУРУ spGetPerson(@PersonID int)
В КАЧЕСТВЕ
ВЫБЕРИТЕ Имя, Фамилию....
ОТ людей
ГДЕ PersonID = @PersonID
SET ANSI_NULLS ON
ИДТИ
УСТАНОВИТЕ QUOTED_IDENTIFIER НА
ИДТИ
СОЗДАТЬ ПРОЦЕДУРУ GetEmployee
@EmployeeID целое = 0
В КАЧЕСТВЕ
НАЧИНАТЬ
УСТАНОВИТЬ БЕЗ СЧЕТА;
ВЫБЕРИТЕ имя, фамилию, дату рождения, город, страну
ОТ сотрудников
ГДЕ СотрудникID = @EmployeeID
КОНЕЦ
ИДТИ
УСТАНОВИТЬ ANSI_NULLS ON
ИДТИ
УСТАНОВИТЕ QUOTED_IDENTIFIER НА
ИДТИ
ИЗМЕНИТЬ ПРОЦЕДУРУ GetEmployee
@EmployeeID целое = 0
В КАЧЕСТВЕ
НАЧИНАТЬ
УСТАНОВИТЬ БЕЗ СЧЕТА;
ВЫБЕРИТЕ имя, фамилию, дату рождения, город, страну
ОТ сотрудников
ГДЕ СотрудникID = @EmployeeID
КОНЕЦ
ИДТИ
УДАЛИТЬ ПРОЦЕДУРУ GetEmployee
EXEC
группировка хранимых процедур
или нумерация хранимых процедур
. ; номер
согласно этому CREATE Процедура FirstTest
(
@InputA INT
)
В КАЧЕСТВЕ
НАЧИНАТЬ
ВЫБЕРИТЕ 'A' + ПРЕОБРАЗОВАТЬ (VARCHAR (10), @InputA)
КОНЕЦ
ИДТИ
СОЗДАТЬ процедуру FirstTest;2
(
@InputA INT,
@InputB INT
)
В КАЧЕСТВЕ
НАЧИНАТЬ
ВЫБЕРИТЕ 'A' + ПРЕОБРАЗОВАТЬ (VARCHAR (10), @InputA) + ПРЕОБРАЗОВАТЬ (VARCHAR (10), @ InputB)
КОНЕЦ
ИДТИ
выполнить первый тест 10
выполнить первый тест;2 20,30
СОЗДАТЬ процедуру SecondTest;2
(
@InputA INT,
@InputB INT
)
В КАЧЕСТВЕ
НАЧИНАТЬ
ВЫБЕРИТЕ 'A' + ПРЕОБРАЗОВАТЬ (VARCHAR (10), @InputA) + ПРЕОБРАЗОВАТЬ (VARCHAR (10), @ InputB)
КОНЕЦ
ИДТИ
СОЗДАТЬ ПРОЦЕДУРУ dorepeat(p1 INT)
НАЧИНАТЬ
УСТАНОВИТЬ @x = 0;
ПОВТОР НАБОР @x = @x + 1; UNTIL @x > p1 END REPEAT;
КОНЕЦ;
> создать процедуру HumanResources.uspFindEmployee `*<<<---Сохранить имя процедуры`*
@businessEntityID `<<<----параметр`
в качестве
начинать
УСТАНОВИТЬ БЕЗ СЧЕТА;
Выберите оператор businessEntityId, <<<----выберите, чтобы вернуть одну строку сотрудника
Национальный идентификационный номер,
Логин ID,
Название работы,
HireData,
Из HumanResources.Employee
где businessEntityId =@businessEntityId <<< --- параметр, используемый в качестве критерия
конец
создать имя_процедуры (para1 int, para2 decimal)
в качестве
выберите * из TableName