Поделиться через


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

Применимо к:SQL ServerБаза данных SQL AzureУправляемый экземпляр SQL AzureAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL база данных в Microsoft Fabric

В этой статье описывается, как выполнить хранимую процедуру в SQL Server с помощью SQL Server Management Studio или Transact-SQL.

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

Когда процедура вызывается приложением или пользователем, ключевое слово Transact-SQL EXECUTE или EXEC явно указывается в вызове. Процедура может вызываться и выполняться без ключевого слова EXEC, если процедура является первой инструкцией в пакете Transact-SQL.

ограничения и запреты

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

EXEC SP_heLP; -- Fails to resolve because SP_heLP doesn't equal sp_help  

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

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

Рекомендации

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

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

Имена системных процедур начинаются с префикса sp_. Так как они логически отображаются во всех пользовательских и системных базах данных, системные процедуры можно выполнять из любой базы данных без полного определения имени процедуры. Однако рекомендуется определить все имена системных процедур с sys именем схемы, чтобы предотвратить конфликты имен. В следующем примере показан рекомендуемый метод вызова системной процедуры.

EXEC sys.sp_who;  

Определяемые пользователем хранимые процедуры

При выполнении определяемой пользователем процедуры рекомендуется указать имя процедуры с именем схемы. Эта практика повышает производительность, так как ядро СУБД не требует поиска нескольких схем. Использование имени схемы также предотвращает выполнение неправильной процедуры, если база данных имеет процедуры с одинаковым именем в нескольких схемах.

В следующих примерах демонстрируется рекомендуемый метод для выполнения определяемой пользователем процедуры. Эта процедура принимает два входных параметра. Сведения об указании входных и выходных параметров см. в разделе "Указание параметров" в хранимой процедуре.

EXECUTE SalesLT.uspGetCustomerCompany @LastName = N'Cannon', @FirstName = N'Chris';
GO

Или сделайте так:

EXEC SalesLT.uspGetCustomerCompany N'Cannon', N'Chris';
GO  

Если указана неквалифицированная пользовательская процедура, ядро СУБД выполняет поиск процедуры в следующем порядке:

  1. Схема sys текущей базы данных.

  2. Схема по умолчанию для инициатора вызова, если процедура выполняется в пакете или в динамическом SQL. Если имя неквалифицированной процедуры появляется в теле другого определения процедуры, схема, содержащая эту другую процедуру, будет следующей для поиска.

  3. Схема dbo в текущей базе данных.

Безопасность

Сведения о безопасности см. в разделах EXECUTE AS (Transact-SQL) и EXECUTE AS Clause (Transact-SQL).

Разрешения

Сведения о разрешениях см. в разделе "Разрешения" в EXECUTE (Transact-SQL).

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

Для выполнения хранимой процедуры можно использовать пользовательский интерфейс SQL Server Management Studio (SSMS) или Transact-SQL в окне запроса SSMS. Всегда используйте последнюю версию SSMS.

Использование SQL Server Management Studio

  1. В Обозревателе объектов подключитесь к экземпляру SQL Server или экземпляру базы данных SQL Azure, разверните этот экземпляр и разверните Базы данных.

  2. Разверните нужную базу данных, разверните узлы Программированиеи Хранимые процедуры.

  3. Щелкните правой кнопкой мыши хранимую процедуру, которую вы хотите запустить, и выберите команду "Выполнить хранимую процедуру".

  4. В диалоговом окне "Процедура выполнения" параметр указывает имя каждого параметра, тип данных указывает тип данных, а выходной параметр указывает, является ли он выходным параметром.

    Для каждого параметра:

    • В поле Value введите значение, используемое для параметра.
    • В разделе "Передать значение NULL" выберите, следует ли передавать значение NULL в качестве значения параметра.
  5. Нажмите кнопку "ОК ", чтобы выполнить хранимую процедуру. Если хранимая процедура не имеет параметров, просто нажмите кнопку "ОК".

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

    Например, чтобы запустить SalesLT.uspGetCustomerCompany хранимую процедуру из статьи "Создание хранимой процедуры", введите Cannon для параметра @LastName и Криса для параметра @FirstName и нажмите кнопку "ОК". Процедура возвращает FirstNameКрис, LastNameКэннон и CompanyNameТовары для активного отдыха.

Использование Transact-SQL в окне запроса

  1. В SSMS подключитесь к экземпляру SQL Server или SQL базы данных Azure.

  2. На панели инструментов выберите "Создать запрос".

  3. Введите инструкцию EXECUTE со следующим синтаксисом в окне запроса, указав значения для всех ожидаемых параметров:

    EXECUTE <ProcedureName> N'<Parameter 1 value>, N'<Parameter x value>;  
    GO  
    

    Например, следующий оператор Transact-SQL выполняет хранимую процедуру uspGetCustomerCompany, где Cannon используется в качестве значения параметра @LastName, а Chris используется в качестве значения параметра @FirstName.

    EXEC SalesLT.uspGetCustomerCompany N'Cannon', N'Chris';
    GO  
    
  4. На панели инструментов выберите "Выполнить". Выполняется хранимая процедура.

Варианты значений параметров

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

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

    EXEC SalesLT.uspGetCustomerCompany N'Cannon', N'Chris';
    
  • Если в шаблоне @parameter_name=value указаны имена параметров, вам не нужно указывать имена параметров и значения в том же порядке, что и они определены. Например, любое из следующих выражений является верным:

    EXEC SalesLT.uspGetCustomerCompany @FirstName = N'Chris', @LastName = N'Cannon';
    

    или:

    EXEC SalesLT.uspGetCustomerCompany @LastName = N'Cannon', @FirstName = N'Chris';
    
  • Если вы используете @parameter_name=value форму для любого параметра, ее необходимо использовать для всех последующих параметров в этой инструкции. Например, вы не можете использовать EXEC SalesLT.uspGetCustomerCompany1 @FirstName = N'Chris', N'Cannon';.

Автоматическое выполнение при запуске

Применяется к: SQL Server

В SQL Server член роли сервера может использовать sp_procoption для установки или очистки процедуры для автоматического выполнения при запуске. Процедуры запуска должны находиться в master базе данных, принадлежать saи не могут иметь входные или выходные параметры. Дополнительные сведения см. в разделе sp_procoption (Transact-SQL).

Процедуры, отмеченные для автоматического выполнения при запуске, выполняются каждый раз, когда SQL Server запускается, и база данных master восстанавливается в процессе этого запуска. Настройка процедур для автоматического выполнения удобна для операций обслуживания базы данных и для постоянного выполнения процедур в фоновом процессе.

Кроме того, автоматический запуск процедур может применяться для выполнения системных или служебных задач в базе данных tempdb, таких как создание глобальной временной таблицы. Автоматическое выполнение гарантирует, что такая временная таблица всегда существует при tempdb повторном создании во время запуска SQL Server.

Автоматически выполняемая процедура работает с теми же разрешениями, что и члены sysadmin фиксированной роли сервера. Любые сообщения об ошибках, создаваемые процедурой, записываются в журнал ошибок SQL Server.

Количество процедур запуска, которые можно использовать, не ограничено, но каждая процедура запуска использует один рабочий поток при выполнении. Если необходимо выполнить несколько процедур при запуске, но не нужно выполнять их параллельно, сделайте одну процедуру запуска и вызовите эту процедуру. Этот метод использует только один рабочий поток.

Совет

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

Примечание.

База данных SQL Azure предназначена для изолирования функций от зависимостей базы данных master. Таким образом, инструкции Transact-SQL, которые настраивают параметры уровня сервера, недоступны в SQL Azure. Часто можно найти альтернативы в других службах Azure, таких как Elastic jobs или Azure Automation.

Настройка процедуры для автоматического выполнения при запуске

Помечать процедуру для автоматического выполнения может только системный администратор (sa).

  1. В SSMS подключитесь к СУБД.

  2. На панели инструментов "Стандартный" выберите "Создать запрос".

  3. Введите следующие команды sp_procoption , чтобы задать хранимую процедуру для автоматического выполнения при запуске SQL Server.

    EXEC sp_procoption @ProcName = N'<stored procedure name>'   
        , @OptionName = 'startup'   
        , @OptionValue = 'on';
    GO
    
  4. На панели инструментов нажмите кнопку "Выполнить".

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

sysadmin может использовать sp_procoption, чтобы остановить автоматическое выполнение процедуры при запуске SQL Server.

  1. В SSMS подключитесь к серверу баз данных.

  2. На панели инструментов "Стандартный" выберите "Создать запрос".

  3. Введите следующие команды в окно запроса.

    EXEC sp_procoption @ProcName = N'<stored procedure name>'      
        , @OptionName = 'startup'
        , @OptionValue = 'off';
    GO
    
  4. На панели инструментов нажмите кнопку "Выполнить".