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

Применимо к:SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure Azure Synapse Analytics AnalyticsPlatform System (PDW)

В этой статье описывается, как выполнить хранимую процедуру в 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 (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 качестве значения параметра и Chris в качестве @LastName@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 для задания или очистки процедуры автоматического sysadmin выполнения при запуске. Процедуры запуска должны находиться в 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 (предварительная версия) или служба автоматизации Azure.

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

Помечать процедуру для автоматического выполнения может только системный администратор (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. На панели инструментов нажмите кнопку "Выполнить".