EXECUTE (Transact-SQL)EXECUTE (Transact-SQL)

ОБЛАСТЬ ПРИМЕНЕНИЯ: даSQL Server даБаза данных SQL Azure даAzure Synapse Analytics (хранилище данных SQL) даParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure Synapse Analytics (SQL DW) yesParallel Data Warehouse

Выполняет строку команды или символьную строку в пакете Transact-SQLTransact-SQL либо один из следующих модулей: системная хранимая процедура, определяемая пользователем хранимая процедура, хранимая процедура CLR, скалярная, определяемая пользователем функция или расширенная хранимая процедура.Executes a command string or character string within a Transact-SQLTransact-SQL batch, or one of the following modules: system stored procedure, user-defined stored procedure, CLR stored procedure, scalar-valued user-defined function, or extended stored procedure. Инструкция EXECUTE может использоваться для отправки транзитных команд на связанные серверы.The EXECUTE statement can be used to send pass-through commands to linked servers. или явно указывать контекст, в котором выполняется команда.Additionally, the context in which a string or command is executed can be explicitly set. Метаданные для результирующего набора могут быть определены с помощью параметров WITH RESULT SETS.Metadata for the result set can be defined by using the WITH RESULT SETS options.

Важно!

Прежде чем передавать инструкции EXECUTE строку символов, выполните ее проверку.Before you call EXECUTE with a character string, validate the character string. Ни в коем случае не запускайте на выполнение команду, которая сформирована на основе данных, введенных пользователем, и не проверена.Never execute a command constructed from user input that has not been validated.

Значок ссылки на раздел Синтаксические обозначения в Transact-SQLTopic link icon Transact-SQL Syntax Conventions

СинтаксисSyntax

-- Syntax for SQL Server  
  
Execute a stored procedure or function  
[ { EXEC | EXECUTE } ]  
    {   
      [ @return_status = ]  
      { module_name [ ;number ] | @module_name_var }   
        [ [ @parameter = ] { value   
                           | @variable [ OUTPUT ]   
                           | [ DEFAULT ]   
                           }  
        ]  
      [ ,...n ]  
      [ WITH <execute_option> [ ,...n ] ]  
    }  
[;]  
  
Execute a character string  
{ EXEC | EXECUTE }   
    ( { @string_variable | [ N ]'tsql_string' } [ + ...n ] )  
    [ AS { LOGIN | USER } = ' name ' ]  
[;]  
  
Execute a pass-through command against a linked server  
{ EXEC | EXECUTE }  
    ( { @string_variable | [ N ] 'command_string [ ? ]' } [ + ...n ]  
        [ { , { value | @variable [ OUTPUT ] } } [ ...n ] ]  
    )   
    [ AS { LOGIN | USER } = ' name ' ]  
    [ AT linked_server_name ]  
[;]  
  
<execute_option>::=  
{  
        RECOMPILE   
    | { RESULT SETS UNDEFINED }   
    | { RESULT SETS NONE }   
    | { RESULT SETS ( <result_sets_definition> [,...n ] ) }  
}   
  
<result_sets_definition> ::=   
{  
    (  
         { column_name   
           data_type   
         [ COLLATE collation_name ]   
         [ NULL | NOT NULL ] }  
         [,...n ]  
    )  
    | AS OBJECT   
        [ db_name . [ schema_name ] . | schema_name . ]   
        {table_name | view_name | table_valued_function_name }  
    | AS TYPE [ schema_name.]table_type_name  
    | AS FOR XML   
}  
-- In-Memory OLTP   

Execute a natively compiled, scalar user-defined function  
[ { EXEC | EXECUTE } ]   
    {   
      [ @return_status = ]   
      { module_name | @module_name_var }   
        [ [ @parameter = ] { value   
                           | @variable   
                           | [ DEFAULT ]   
                           }  
        ]   
      [ ,...n ]   
      [ WITH <execute_option> [ ,...n ] ]   
    }  
<execute_option>::=  
{  
    | { RESULT SETS UNDEFINED }   
    | { RESULT SETS NONE }   
    | { RESULT SETS ( <result_sets_definition> [,...n ] ) }  
}  
-- Syntax for Azure SQL Database   
  
Execute a stored procedure or function  
[ { EXEC | EXECUTE } ]  
    {   
      [ @return_status = ]  
      { module_name  | @module_name_var }   
        [ [ @parameter = ] { value   
                           | @variable [ OUTPUT ]   
                           | [ DEFAULT ]   
                           }  
        ]  
      [ ,...n ]  
      [ WITH RECOMPILE ]  
    }  
[;]  
  
Execute a character string  
{ EXEC | EXECUTE }   
    ( { @string_variable | [ N ]'tsql_string' } [ + ...n ] )  
    [ AS {  USER } = ' name ' ]  
[;]  
  
<execute_option>::=  
{  
        RECOMPILE   
    | { RESULT SETS UNDEFINED }   
    | { RESULT SETS NONE }   
    | { RESULT SETS ( <result_sets_definition> [,...n ] ) }  
}   
  
<result_sets_definition> ::=   
{  
    (  
         { column_name   
           data_type   
         [ COLLATE collation_name ]   
         [ NULL | NOT NULL ] }  
         [,...n ]  
    )  
    | AS OBJECT   
        [ db_name . [ schema_name ] . | schema_name . ]   
        {table_name | view_name | table_valued_function_name }  
    | AS TYPE [ schema_name.]table_type_name  
    | AS FOR XML  
  
-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse  

-- Execute a stored procedure  
[ { EXEC | EXECUTE } ]  
    procedure_name   
        [ { value | @variable [ OUT | OUTPUT ] } ] [ ,...n ] }  
[;]  
  
-- Execute a SQL string  
{ EXEC | EXECUTE }  
    ( { @string_variable | [ N ] 'tsql_string' } [ +...n ] )  
[;]  

АргументыArguments

@return_status@return_status
Необязательная целочисленная переменная, в которой сохраняется состояние возврата из модуля.Is an optional integer variable that stores the return status of a module. Этот аргумент должен быть объявлен в пакете, хранимой процедуре или функции, прежде чем его можно будет указать в инструкции EXECUTE.This variable must be declared in the batch, stored procedure, or function before it is used in an EXECUTE statement.

Если используется для вызова скалярной, определяемой пользователем функции, переменная @return_status может иметь любой скалярный тип данных.When used to invoke a scalar-valued user-defined function, the @return_status variable can be of any scalar data type.

module_namemodule_name
Полное или неполное имя вызываемой хранимой процедуры или скалярной пользовательской функции.Is the fully qualified or nonfully qualified name of the stored procedure or scalar-valued user-defined function to call. Имена модулей должны соответствовать правилам для идентификаторов.Module names must comply with the rules for identifiers. В именах расширенных хранимых процедур учитывается регистр, вне зависимости от параметров сортировки сервера.The names of extended stored procedures are always case-sensitive, regardless of the collation of the server.

Допускается выполнение модуля, созданного в другой базе данных, если пользователь, выполняющий этот модуль, является его владельцем или имеет соответствующие разрешения на его выполнение в этой базе данных.A module that has been created in another database can be executed if the user running the module owns the module or has the appropriate permission to execute it in that database. Модуль может быть выполнен на другом сервере SQL ServerSQL Server, если пользователь, запускающий модуль на выполнение, имеет соответствующие разрешения на этом сервере (удаленный доступ) и на выполнение модуля в этой базе данных.A module can be executed on another server running SQL ServerSQL Server if the user running the module has the appropriate permission to use that server (remote access) and to execute the module in that database. Если указано имя сервера, а имя базы данных не указано, компонент Компонент SQL Server Database EngineSQL Server Database Engine ищет модуль в базе данных пользователя по умолчанию.If a server name is specified but no database name is specified, the Компонент SQL Server Database EngineSQL Server Database Engine looks for the module in the default database of the user.

number;number
Применимо к: с SQL Server 2008SQL Server 2008 до SQL Server 2019SQL Server 2019Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2019SQL Server 2019

Необязательный целочисленный аргумент, используемый для группирования одноименных процедур.Is an optional integer that is used to group procedures of the same name. Этот аргумент не предназначен для расширенных хранимых процедур.This parameter is not used for extended stored procedures.

Примечание

Этот компонент находится в режиме обслуживания и может быть удален в будущей версии Microsoft SQL Server.This feature is in maintenance mode and may be removed in a future version of Microsoft SQL Server. Избегайте использования этого компонента в новых разработках и запланируйте изменение существующих приложений, в которых он применяется.Avoid using this feature in new development work, and plan to modify applications that currently use this feature.

Дополнительные сведения о группах процедур см. в статье CREATE PROCEDURE (Transact-SQL).For more information about procedure groups, see CREATE PROCEDURE (Transact-SQL).

@module_name_var@module_name_var
Имя локально определенной переменной, которая содержит имя модуля.Is the name of a locally defined variable that represents a module name.

Это может быть переменная, содержащая имя скомпилированной в собственном коде скалярной определяемой пользователем функции.This can be a variable that holds the name of a natively compiled, scalar user-defined function.

@parameter@parameter
Параметр для module_name, как определено в модуле.Is the parameter for module_name, as defined in the module. Имена аргументов должны предваряться символом (@).Parameter names must be preceded by the at sign (@). Если используется в формате @parameter_name=value, то имена параметров и констант могут указываться не в том порядке, в котором они определены в модуле.When used with the @parameter_name=value form, parameter names and constants do not have to be supplied in the order in which they are defined in the module. Однако если какой-либо из параметров указан в формате @parameter_name=value, то все последующие параметры должны быть указаны в том же формате.However, if the @parameter_name=value form is used for any parameter, it must be used for all subsequent parameters.

По умолчанию параметры могут допускать значения NULL.By default, parameters are nullable.

valuevalue
Значение параметра, передаваемое модулю или транзитной команде.Is the value of the parameter to pass to the module or pass-through command. Если имена параметров не указаны, значения параметров должны указываться в том же порядке, в каком они определены в модуле.If parameter names are not specified, parameter values must be supplied in the order defined in the module.

При выполнении транзитных команд для связанных серверов порядок значений параметров зависит от поставщика OLE DB связанного сервера.When executing pass-through commands against linked servers, the order of the parameter values depends on the OLE DB provider of the linked server. Большинство поставщиков OLE DB привязывают значения к аргументам слева направо.Most OLE DB providers bind values to parameters from left to right.

Если значение параметра является именем объекта, символьной строкой или предваряется именем базы данных или схемы, это значение целиком должно быть заключено в одинарные кавычки.If the value of a parameter is an object name, character string, or qualified by a database name or schema name, the whole name must be enclosed in single quotation marks. Если значение параметра является ключевым словом, оно должно быть заключено в двойные кавычки.If the value of a parameter is a keyword, the keyword must be enclosed in double quotation marks.

Если вы передаете одно слово, которое не начинается с @ и не заключено в кавычки (например, если вы забудете @ в имени параметра), слово рассматривается как строка типа nvarchar, несмотря на отсутствие кавычек.If you pass a single word that does not begin with @ and that's not enclosed in quotation marks - for example, if you forget @ on a parameter name - the word is treated as an nvarchar string, in spite of the missing quotation marks.

Если в модуле определено значение по умолчанию, пользователь может вызвать модуль без указания этого параметра.If a default is defined in the module, a user can execute the module without specifying a parameter.

Значение по умолчанию может быть равно NULL.The default can also be NULL. Как правило, действие, которое должно быть выполнено в этом случае, указывается в определении модуля.Generally, the module definition specifies the action that should be taken if a parameter value is NULL.

@variable@variable
Переменная, в которой сохраняется или возвращается аргумент.Is the variable that stores a parameter or a return parameter.

OUTPUTOUTPUT
Указывает, что модуль или командная строка возвращает параметр.Specifies that the module or command string returns a parameter. Совпадающий параметр модуля или командной строки также должен быть создан с ключевым словом OUTPUT.The matching parameter in the module or command string must also have been created by using the keyword OUTPUT. Это ключевое слово следует указывать для переменной курсора, если она передается в качестве аргумента.Use this keyword when you use cursor variables as parameters.

Если value определен как OUTPUT модуля, выполняемого для связанного сервера, то любые изменения в соответствующем параметре @parameter, произведенные поставщиком OLE DB, по окончании выполнения модуля будут скопированы обратно в переменную.If value is defined as OUTPUT of a module executed against a linked server, any changes to the corresponding @parameter performed by the OLE DB provider will be copied back to the variable at the end of the execution of module.

Если используются параметры OUTPUT и предполагается использовать возвращаемые значения в других инструкциях вызываемого пакета или модуля, значение параметра должно передаваться в виде переменной, то есть @parameter = @variable.If OUTPUT parameters are being used and the intent is to use the return values in other statements within the calling batch or module, the value of the parameter must be passed as a variable, such as @parameter = @variable. Выполнить модуль, указав OUTPUT для параметра, который не определен в модуле как параметр OUTPUT, нельзя.You cannot execute a module by specifying OUTPUT for a parameter that is not defined as an OUTPUT parameter in the module. Константы в качестве аргументов OUTPUT в модуль не передаются, а для возврата аргумента необходимо указывать имя переменной.Constants cannot be passed to module by using OUTPUT; the return parameter requires a variable name. Перед выполнением процедуры для переменной должен быть объявлен тип данных и присвоено значение.The data type of the variable must be declared and a value assigned before executing the procedure.

Если EXECUTE выполняет удаленную хранимую процедуру или транзитную команду к связанному серверу, то параметры OUTPUT не могут иметь типы данных больших объектов (LOB).When EXECUTE is used against a remote stored procedure, or to execute a pass-through command against a linked server, OUTPUT parameters cannot be any one of the large object (LOB) data types.

Возвращаемые аргументы могут иметь любой тип, кроме типов данных LOB.Return parameters can be of any data type except the LOB data types.

DEFAULTDEFAULT
Определяет значение параметра по умолчанию, как определено в модуле.Supplies the default value of the parameter as defined in the module. Если в модуле для параметра не определено значения по умолчанию, а при вызове для этого параметра ни значение, ни ключевое слово DEFAULT не указаны, выдается ошибка.When the module expects a value for a parameter that does not have a defined default and either a parameter is missing or the DEFAULT keyword is specified, an error occurs.

@string_variable@string_variable
Имя локальной переменной.Is the name of a local variable. @string_variable может иметь любой тип данных: char, varchar, nchar или nvarchar. @string_variable can be any char, varchar, nchar, or nvarchar data type. В том числе типы данных (max) .These include the (max) data types.

[N] 'tsql_string'[N] 'tsql_string'
Строковая константа.Is a constant string. tsql_string может иметь любой тип данных nvarchar или varchar.tsql_string can be any nvarchar or varchar data type. Если указано "N", строка интерпретируется как тип данных nvarchar.If the N is included, the string is interpreted as nvarchar data type.

AS <context_specification>AS <context_specification>
Определяет контекст, в котором выполняется инструкция.Specifies the context in which the statement is executed.

Имя_для_входаLOGIN
Применимо к: с SQL Server 2008SQL Server 2008 до SQL Server 2019SQL Server 2019Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2019SQL Server 2019

Указывает, что воплощаемым контекстом является имя входа,Specifies the context to be impersonated is a login. область олицетворения — сервер.The scope of impersonation is the server.

ПользовательUSER
Определяет контекст для олицетворения пользователя в текущей базе данных.Specifies the context to be impersonated is a user in the current database. Область олицетворения ограничена текущей базой данных.The scope of impersonation is restricted to the current database. При переключении контекста на пользователя базы данных разрешения уровня сервера этого пользователя не наследуются.A context switch to a database user does not inherit the server-level permissions of that user.

Важно!

Пока активно переключение контекста на пользователя базы данных, любая попытка доступа к ресурсам за ее пределами вызовет ошибку выполнения инструкции.While the context switch to the database user is active, any attempt to access resources outside the database will cause the statement to fail. Это относится к инструкциям USE database, распределенным запросам, а также запросам, содержащим ссылки на другие базы данных по идентификаторам, состоящим из трех или четырех элементов.This includes USE database statements, distributed queries, and queries that reference another database by using three- or four-part identifiers.

'name''name'
Допустимое имя пользователя или имя входа.Is a valid user or login name. Аргумент name должен принадлежать предопределенной роли сервера sysadmin либо быть участником в базе данных sys.database_principals или sys.server_principals соответственно.name must be a member of the sysadmin fixed server role or exist as a principal in sys.database_principals or sys.server_principals, respectively.

В качестве аргумента name не может быть указана встроенная учетная запись (например NT AUTHORITY\LocalService, NT AUTHORITY\NetworkService или NT AUTHORITY\LocalSystem).name cannot be a built-in account, such as NT AUTHORITY\LocalService, NT AUTHORITY\NetworkService, or NT AUTHORITY\LocalSystem.

Дополнительные сведения см. в разделе Указание имени пользователя или имени входа далее.For more information, see Specifying a User or Login Name later in this topic.

[N] 'command_string'[N] 'command_string'
Строковая константа, содержащая транзитную команду, передаваемую связанному серверу.Is a constant string that contains the command to be passed through to the linked server. Если указано "N", строка интерпретируется как тип данных nvarchar.If the N is included, the string is interpreted as nvarchar data type.

[?][?]
Обозначает параметры, для которых задаются значения в списке <arg-list> передаваемых команд, используемых в инструкции EXEC('…', <arg-list>) AT <linkedsrv>.Indicates parameters for which values are supplied in the <arg-list> of pass-through commands that are used in an EXEC('...', <arg-list>) AT <linkedsrv> statement.

AT linked_server_nameAT linked_server_name
Применимо к: с SQL Server 2008SQL Server 2008 до SQL Server 2019SQL Server 2019Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2019SQL Server 2019

Указывает, что command_string выполняется для linked_server_name, а результаты, при их наличии, возвращаются клиенту.Specifies that command_string is executed against linked_server_name and results, if any, are returned to the client. Значение linked_server_name должно указывать на существующее определение связанного сервера на локальном сервере.linked_server_name must refer to an existing linked server definition in the local server. Определение связанного сервера производится при помощи хранимой процедуры sp_addlinkedserver.Linked servers are defined by using sp_addlinkedserver.

WITH <execute_option>WITH <execute_option>
Возможные параметры выполнения.Possible execute options. Параметры RESULT SETS нельзя указывать в инструкции INSERT...EXEC.The RESULT SETS options cannot be specified in an INSERT...EXEC statement.

ТерминTerm ОпределениеDefinition
RECOMPILERECOMPILE Инициирует перекомпиляцию нового плана, его использование и удаление после выполнения модуля.Forces a new plan to be compiled, used, and discarded after the module is executed. Если для модуля имеется существующий план запроса, то он остается в кэше.If there is an existing query plan for the module, this plan remains in the cache.

Следует указывать этот параметр в тех случаях, когда передаются нетипичные аргументы или если данные существенно изменились.Use this option if the parameter you are supplying is atypical or if the data has significantly changed. Он не предназначен для расширенных хранимых процедур.This option is not used for extended stored procedures. Рекомендуется реже пользоваться этим параметром, поскольку он очень ресурсоемок.We recommend that you use this option sparingly because it is expensive.

Примечание. Использовать параметр WITH RECOMPILE при вызове хранимой процедуры, для которой применяется синтаксис OPENDATASOURCE, невозможно.Note: You can not use WITH RECOMPILE when calling a stored procedure that uses OPENDATASOURCE syntax. Параметр WITH RECOMPILE не учитывается при указании четырехкомпонентного имени объекта.The WITH RECOMPILE option is ignored when a four-part object name is specified.

Примечание. Скомпилированные в собственном коде скалярные определяемые пользователем функции не поддерживают RECOMPILE.Note: RECOMPILE is not supported with natively compiled, scalar user-defined functions. Если потребуется выполнить повторную компиляцию, используйте процедуру sp_recompile (Transact-SQL).If you need to recompile, use sp_recompile (Transact-SQL).
RESULT SETS UNDEFINEDRESULT SETS UNDEFINED Применимо к: с SQL Server 2012 (11.x)SQL Server 2012 (11.x) до SQL Server 2019SQL Server 2019, База данных SQL AzureAzure SQL Database.Applies to: SQL Server 2012 (11.x)SQL Server 2012 (11.x) through SQL Server 2019SQL Server 2019, База данных SQL AzureAzure SQL Database.

Этот параметр не дает гарантии, какие результаты, если они есть, будут возвращены. Определение также не предоставляется.This option provides no guarantee of what results, if any, will be returned, and no definition is provided. Инструкция выполняется без ошибок, независимо от того, возвращаются ли какие-либо результаты.The statement executes without error if any results are returned or no results are returned. RESULT SETS UNDEFINED — действие по умолчанию, если не указан result_sets_option.RESULT SETS UNDEFINED is the default behavior if a result_sets_option is not provided.

Для интерпретируемых скалярных определяемых пользователем функций и скомпилированных в собственном коде скалярных определяемых пользователем функций этот параметр не работает, так как функции никогда не возвращают результирующий набор.For interpreted scalar user-defined functions, and natively compiled scalar user-defined functions, this option is not operational because the functions never return a result set.
RESULT SETS NONERESULT SETS NONE Применимо к: с SQL Server 2012 (11.x)SQL Server 2012 (11.x) до SQL Server 2019SQL Server 2019, База данных SQL AzureAzure SQL Database.Applies to: SQL Server 2012 (11.x)SQL Server 2012 (11.x) through SQL Server 2019SQL Server 2019, База данных SQL AzureAzure SQL Database.

Гарантирует, что выполняемая инструкция не вернет никаких результатов.Guarantees that the execute statement will not return any results. Если возвращены какие-либо результаты, то пакет отменяется.If any results are returned the batch is aborted.

Для интерпретируемых скалярных определяемых пользователем функций и скомпилированных в собственном коде скалярных определяемых пользователем функций этот параметр не работает, так как функции никогда не возвращают результирующий набор.For interpreted scalar user-defined functions, and natively compiled scalar user-defined functions, this option is not operational because the functions never return a result set.
<result_sets_definition><result_sets_definition> Применимо к: с SQL Server 2012 (11.x)SQL Server 2012 (11.x) до SQL Server 2019SQL Server 2019, База данных SQL AzureAzure SQL Database.Applies to: SQL Server 2012 (11.x)SQL Server 2012 (11.x) through SQL Server 2019SQL Server 2019, База данных SQL AzureAzure SQL Database.

Обеспечивает гарантию, что результат будет возвращен в виде, определенном в result_sets_definition.Provides a guarantee that the result will come back as specified in the result_sets_definition. Для выражений, которые возвращают множество результирующих наборов, обеспечьте множество разделов result_sets_definition.For statements that return multiple result sets, provide multiple result_sets_definition sections. Заключите каждый раздел result_sets_definition в скобки, разделяя их запятыми.Enclose each result_sets_definition in parentheses, separated by commas. Дополнительные сведения см. далее в подразделе <result_sets_definition>.For more information, see <result_sets_definition> later in this topic.

Этот параметр всегда приводит к ошибке для скомпилированных в собственном коде скалярных определяемых пользователем функций, поскольку функции никогда не возвращают результирующий набор.This option always results in an error for natively compiled, scalar user-defined functions because the functions never return a result set.

<result_sets_definition> Применимо к: с SQL Server 2012 (11.x)SQL Server 2012 (11.x) до SQL Server 2019SQL Server 2019, База данных SQL AzureAzure SQL Database<result_sets_definition> Applies to: SQL Server 2012 (11.x)SQL Server 2012 (11.x) through SQL Server 2019SQL Server 2019, База данных SQL AzureAzure SQL Database

Описывает результирующие наборы, возвращенные выполненными инструкциями.Describes the result sets returned by the executed statements. Предложения result_sets_definition имеют следующий смыслThe clauses of the result_sets_definition have the following meaning

ТерминTerm ОпределениеDefinition
{{

column_namecolumn_name

Тип данныхdata_type

[ COLLATE collation_name][ COLLATE collation_name]

[NULL | NOT NULL][NULL | NOT NULL]

}}
См. таблицу ниже.See the table below.
db_namedb_name Имя базы данных, содержащей таблицу, представление или возвращающую табличное значение функцию.The name of the database containing the table, view or table valued function.
schema_nameschema_name Имя схемы, являющейся владельцем таблицы, представления или возвращающей табличное значение функции.The name of the schema owning the table, view or table valued function.
table_name &#124 view_name &#124 table_valued_function_nametable_name | view_name | table_valued_function_name Указывает, что будут возвращены столбцы, указанные в таблице, представлении или возвращающей табличное значение функции.Specifies that the columns returned will be those specified in the table, view or table valued function named. Табличные переменные, временные таблицы и синонимы не поддерживаются синтаксисом объектов AS.Table variables, temporary tables, and synonyms are not supported in the AS object syntax.
AS TYPE [schema_name.]table_type_nameAS TYPE [schema_name.]table_type_name Указывает, что будут возвращены столбцы, указанные в типе таблицы.Specifies that the columns returned will be those specified in the table type.
AS FOR XMLAS FOR XML Указывает, что результаты XML, полученные от инструкции или хранимой процедуры, которая вызывается с помощью инструкции EXECUTE, преобразуются в формат, как если бы они были сформированы инструкцией SELECT ... Инструкция FOR XML ...Specifies that the XML results from the statement or stored procedure called by the EXECUTE statement will be converted into the format as though they were produced by a SELECT ... FOR XML ... statement. Все форматирование директив типов удаляется из исходной инструкции, а результаты возвращаются, как если бы директива типа не была указана.All formatting from the type directives in the original statement are removed, and the results returned are as though no type directive was specified. AS FOR XML не преобразует в XML отличные от XML табличные результаты, полученные от выполненной инструкции или хранимой процедуры.AS FOR XML does not convert non-XML tabular results from the executed statement or stored procedure into XML.
ТерминTerm ОпределениеDefinition
column_namecolumn_name Имена всех столбцов.The names of each column. Если число столбцов отличается от результирующего набора, возникнет ошибка и пакет будет отменен.If the number of columns differs from the result set, an error occurs and the batch is aborted. Если имя столбца отличается от результирующего набора, то возвращаемое имя столбца будет установлено в имя из определения.If the name of a column differs from the result set, the column name returned will be set to the name defined.
Тип данныхdata_type Типы данных для каждого из столбцов.The data types of each column. Если типы данных различаются, то выполняется неявное преобразование к определенному типу данных.If the data types differ, an implicit conversion to the defined data type is performed. Если преобразование выполнить не удалось, то пакет отменяетсяIf the conversion fails the batch is aborted
COLLATE collation_nameCOLLATE collation_name Параметры сортировки для каждого из столбцов.The collation of each column. При несоответствии параметров сортировки предпринимается попытка неявного его приведения.If there is a collation mismatch, an implicit collation is attempted. Если это сделать не удалось, пакет отменяется.If that fails, the batch is aborted.
NULL NOT NULLNULL | NOT NULL Допустимость значения NULL для каждого из столбцов.The nullability of each column. Если определено NOT NULL, а возвращенные данные содержат значения NULL, то возникает ошибка и пакет отменяется.If the defined nullability is NOT NULL and the data returned contains NULLs an error occurs and the batch is aborted. Если ничего не указано, то значение по умолчанию соответствует параметрам ANSI_NULL_DFLT_ON и ANSI_NULL_DFLT_OFF.If not specified, the default value conforms to the setting of the ANSI_NULL_DFLT_ON and ANSI_NULL_DFLT_OFF options.

Фактический результирующий набор, возвращаемый во время выполнения, может отличаться от результата, определенного в предложении WITH RESULT SETS по одному из следующих признаков: числом результирующих наборов, числом столбцов, именами столбцов, допустимостью значений NULL и типами данных.The actual result set being returned during execution can differ from the result defined using the WITH RESULT SETS clause in one of the following ways: number of result sets, number of columns, column name, nullability, and data type. Если отличается число результирующих наборов, возникнет ошибка, и пакет будет отменен.If the number of result sets differs, an error occurs and the batch is aborted.

RemarksRemarks

Параметры могут передаваться через value или с помощью @parameter_name=value.Parameters can be supplied either by using value or by using @parameter_name=value. . Параметр не является частью транзакции, поэтому если он изменился в транзакции, которая впоследствии подверглась откату, то прежнее значение параметра не восстанавливается.A parameter is not part of a transaction; therefore, if a parameter is changed in a transaction that is later rolled back, the value of the parameter does not revert to its previous value. Возвращаемым вызывающему значением всегда является то значение, которое существует на момент выхода из модуля.The value returned to the caller is always the value at the time the module returns.

Если модуль вызывает другой модуль, выполняет управляемый код модуля среды CLR, определяемого пользователем типа или статистического выражения, возникает вложенность.Nesting occurs when one module calls another or executes managed code by referencing a common language runtime (CLR) module, user-defined type, or aggregate. Уровень вложенности увеличивается каждый раз, когда вызванный модуль или управляемый код начинает выполнение, и уменьшается при завершении его выполнения.The nesting level is incremented when the called module or managed code reference starts execution, and it is decremented when the called module or managed code reference has finished. Превышение максимальной вложенности (32 уровня) приводит к ошибке выполнения всей цепочки вызовов.Exceeding the maximum of 32 nesting levels causes the complete calling chain to fail. Текущий уровень вложенности хранится в системной функции @@NESTLEVEL.The current nesting level is stored in the @@NESTLEVEL system function.

Поскольку удаленные хранимые процедуры и расширенные хранимые процедуры не входят в область транзакции (это не относится к транзакциям, начатым инструкцией BEGIN DISTRIBUTED TRANSACTION или при указании различных параметров конфигурации), осуществить откат команд, выполняемых через вызовы к ним, невозможно.Because remote stored procedures and extended stored procedures are not within the scope of a transaction (unless issued within a BEGIN DISTRIBUTED TRANSACTION statement or when used with various configuration options), commands executed through calls to them cannot be rolled back. Дополнительные сведения см. в разделах Системные хранимые процедуры(Transact-SQL) и BEGIN DISTRIBUTED TRANSACTION (Transact-SQL).For more information, see System Stored Procedures (Transact-SQL) and BEGIN DISTRIBUTED TRANSACTION (Transact-SQL).

Если выполняется процедура, которая передает переменную типа cursor с размещенным в ней курсором, то возникает ошибка.When you use cursor variables, if you execute a procedure that passes in a cursor variable with a cursor allocated to it an error occurs.

Не надо указывать ключевое слово EXECUTE при выполнении модулей, если эта инструкция стоит первой в пакете.You do not have to specify the EXECUTE keyword when executing modules if the statement is the first one in a batch.

Дополнительные сведения, относящиеся к хранимым процедурам CLR, см. в разделе «Хранимые процедуры CLR».For additional information specific to CLR stored procedures, see CLR Stored Procedures.

Выполнение хранимых процедур через EXECUTEUsing EXECUTE with Stored Procedures

Не надо указывать ключевое слово EXECUTE при выполнении хранимых процедур, если эта инструкция стоит первой в пакете.You do not have to specify the EXECUTE keyword when you execute stored procedures when the statement is the first one in a batch.

Имена системных хранимых процедур SQL ServerSQL Server начинаются с символов «sp_».SQL ServerSQL Server system stored procedures start with the characters sp_. Физически они хранятся в базе данных Resource, но логически относятся к схеме sys любой системной или определяемой пользователем базе данных.They are physically stored in the Resource database, but logically appear in the sys schema of every system and user-defined database. При выполнении системной расширенной хранимой процедуры (в пакете или в модуле, например в пользовательской хранимой процедуре или функции) рекомендуется предварять ее имя указанием схемы sys.When you execute a system stored procedure, either in a batch or inside a module such as a user-defined stored procedure or function, we recommend that you qualify the stored procedure name with the sys schema name.

Имена системных расширенных хранимых процедур SQL ServerSQL Server начинаются с символов «xp_» и содержатся в схеме dbo базы данных master.SQL ServerSQL Server system extended stored procedures start with the characters xp_, and these are contained in the dbo schema of the master database. При выполнении системной расширенной хранимой процедуры (в пакете или в модуле, например в пользовательской хранимой процедуре или функции) рекомендуется предварять ее имя указанием master.dbo.When you execute a system extended stored procedure, either in a batch or inside a module such as a user-defined stored procedure or function, we recommend that you qualify the stored procedure name with master.dbo.

При выполнении пользовательской хранимой процедуры (в пакете или в модуле, например в пользовательской хранимой процедуре или функции) рекомендуется предварять ее имя указанием схемы.When you execute a user-defined stored procedure, either in a batch or inside a module such as a user-defined stored procedure or function, we recommend that you qualify the stored procedure name with a schema name. Не рекомендуется давать пользовательским хранимым процедурам те же имена, что и системным.We do not recommend that you name a user-defined stored procedure with the same name as a system stored procedure. Дополнительные сведения о выполнении хранимых процедур см. в разделе Выполнение хранимых процедур.For more information about executing stored procedures, see Execute a Stored Procedure.

Указание в EXECUTE символьных строкUsing EXECUTE with a Character String

В предыдущих версиях SQL ServerSQL Server длина символьной строки была ограничена 8 000 байт.In earlier versions of SQL ServerSQL Server, character strings are limited to 8,000 bytes. Это требовало динамического объединения длинных строк во время выполнения.This requires concatenating large strings for dynamic execution. В SQL ServerSQL Server можно указать типы данных varchar(max) и nvarchar(max) , которые позволяют символьным строкам содержать до 2 ГБ данных.In SQL ServerSQL Server, the varchar(max) and nvarchar(max) data types can be specified that allow for character strings to be up to 2 gigabytes of data.

Изменения в контексте базы данных действуют только до окончания инструкции EXECUTE.Changes in database context last only until the end of the EXECUTE statement. Например, после запуска инструкции EXEC контекстом базы данных становится master.For example, after the EXEC in this following statement is run, the database context is master.

USE master; EXEC ('USE AdventureWorks2012; SELECT BusinessEntityID, JobTitle FROM HumanResources.Employee;');  

Переключение контекстаContext Switching

Предложение AS { LOGIN | USER } = ' name ' переключает контекст выполнения динамической инструкции.You can use the AS { LOGIN | USER } = ' name ' clause to switch the execution context of a dynamic statement. Если переключение контекста указано в виде EXECUTE ('string') AS <context_specification>, его длительность ограничена областью действия запроса, в котором он выполняется.When the context switch is specified as EXECUTE ('string') AS <context_specification>, the duration of the context switch is limited to the scope of the query being executed.

Указание имени пользователя или имени входаSpecifying a User or Login Name

Имя пользователя или имя входа, указанное в предложении AS { LOGIN | USER } = ' name ', должно присутствовать в качестве участника в представлении sys.database_principals или sys.server_principals соответственно, в противном случае инструкция завершится ошибкой.The user or login name specified in AS { LOGIN | USER } = ' name ' must exist as a principal in sys.database_principals or sys.server_principals, respectively, or the statement will fail. Кроме того, этому участнику должны быть предоставлены разрешения IMPERSONATE.Additionally, IMPERSONATE permissions must be granted on the principal. Если процедура вызывается не владельцем базы данных и не членом предопределенной роли сервера sysadmin, указанный участник должен существовать даже в том случае, если пользователь производит доступ к базе данных или экземпляру SQL ServerSQL Server в качестве члена группы Windows.Unless the caller is the database owner or is a member of the sysadmin fixed server role, the principal must exist even when the user is accessing the database or instance of SQL ServerSQL Server through a Windows group membership. Для примера рассмотрим следующие условия.For example, assume the following conditions:

  • Группа CompanyDomain\SQLUsers имеет доступ к базе данных Sales.CompanyDomain\SQLUsers group has access to the Sales database.

  • Пользователь CompanyDomain\SqlUser1 является членом группы SQLUsers и, таким образом, неявно имеет доступ к базе данных Sales.CompanyDomain\SqlUser1 is a member of SQLUsers and, therefore, has implicit access to the Sales database.

Несмотря на то, что пользователь CompanyDomain\SqlUser1 имеет доступ к базе данных как член группы SQLUsers, инструкция EXECUTE @string_variable AS USER = 'CompanyDomain\SqlUser1' завершится ошибкой, так как CompanyDomain\SqlUser1 не существует в базе данных в качестве участника.Although CompanyDomain\SqlUser1 has access to the database through membership in the SQLUsers group, the statement EXECUTE @string_variable AS USER = 'CompanyDomain\SqlUser1' will fail because CompanyDomain\SqlUser1 does not exist as a principal in the database.

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

Указывайте имя входа или пользователя, имеющего минимальные права на операции, выполняемые в инструкции или модуле.Specify a login or user that has the least privileges required to perform the operations that are defined in the statement or module. Например: не следует указывать имя входа, которое обладает разрешениями уровня сервера, если необходимы только разрешения уровня базы данных. Учетную запись владельца базы данных следует указывать только тогда, когда разрешения, которыми он обладает, действительно необходимы.For example, do not specify a login name, which has server-level permissions, if only database-level permissions are required; or do not specify a database owner account unless those permissions are required.

РазрешенияPermissions

На выполнение инструкции EXECUTE разрешения не требуются.Permissions are not required to run the EXECUTE statement. Однако необходимы разрешения на защищаемые объекты, на которые ссылается командная строка в инструкции EXECUTE.However, permissions are required on the securables that are referenced within the EXECUTE string. Например, если строка содержит инструкцию INSERT, вызывающий инструкцию EXECUTE пользователь должен иметь разрешение INSERT на целевую таблицу.For example, if the string contains an INSERT statement, the caller of the EXECUTE statement must have INSERT permission on the target table. Разрешения проверяются в месте нахождения инструкции EXECUTE, даже если она содержится внутри модуля.Permissions are checked at the time EXECUTE statement is encountered, even if the EXECUTE statement is included within a module.

Разрешение EXECUTE на модуль по умолчанию имеет владелец модуля, который может передать его другим пользователям.EXECUTE permissions for a module default to the owner of the module, who can transfer them to other users. При запуске модуля, выполняющего командную строку, разрешения проверяются в контексте того пользователя, который выполняет модуль, а не того, который его создал.When a module is run that executes a string, permissions are checked in the context of the user who executes the module, not in the context of the user who created the module. Но в случае, если владельцем вызывающего и вызываемого модуля является один и тот же пользователь, проверка разрешений EXECUTE для второго модуля не выполняется.However, if the same user owns the calling module and the module being called, EXECUTE permission checking is not performed for the second module.

Если модуль производит доступ к другому объекту базы данных, то выполнение завершится успешно при наличии разрешения EXECUTE на модуль и при выполнении одного из следующих условий.If the module accesses other database objects, execution succeeds when you have EXECUTE permission on the module and one of the following is true:

  • Модуль помечен как EXECUTE AS USER или SELF, и владелец модуля обладает соответствующими разрешениями на данный объект.The module is marked EXECUTE AS USER or SELF, and the module owner has the corresponding permissions on the referenced object. Дополнительные сведения об олицетворении в модуле см. в разделе Предложение EXECUTE AS (Transact-SQL).For more information about impersonation within a module, see EXECUTE AS Clause (Transact-SQL).

  • Модуль помечен как EXECUTE AS CALLER, и есть соответствующие разрешения на данный объект.The module is marked EXECUTE AS CALLER, and you have the corresponding permissions on the object.

  • Модуль помечен как EXECUTE AS user_name, а user_name имеет соответствующие разрешения на объект.The module is marked EXECUTE AS user_name, and user_name has the corresponding permissions on the object.

Разрешения для переключения контекстаContext Switching Permissions

Чтобы указать в предложении EXECUTE AS имя входа, вызывающая сторона должна иметь разрешения IMPERSONATE на указанное имя входа.To specify EXECUTE AS on a login, the caller must have IMPERSONATE permissions on the specified login name. Чтобы указать в предложении EXECUTE AS пользователя базы данных, вызывающая сторона должна иметь разрешения IMPERSONATE на указанное имя входа.To specify EXECUTE AS on a database user, the caller must have IMPERSONATE permissions on the specified user name. Если контекст выполнения не указан или указано EXECUTE AS CALLER, никакие разрешения IMPERSONATE не требуются.When no execution context is specified, or EXECUTE AS CALLER is specified, IMPERSONATE permissions are not required.

ПримерыExamples

A.A. Вызов EXECUTE с передачей единственного аргументаUsing EXECUTE to pass a single parameter

Хранимая процедура uspGetEmployeeManagers в базе данных AdventureWorks2012AdventureWorks2012 ожидает один параметр (@EmployeeID).The uspGetEmployeeManagers stored procedure in the AdventureWorks2012AdventureWorks2012 database expects one parameter (@EmployeeID). В следующем примере производится выполнение хранимой процедуры uspGetEmployeeManagers с Employee ID 6 в качестве значения параметра.The following examples execute the uspGetEmployeeManagers stored procedure with Employee ID 6 as its parameter value.

EXEC dbo.uspGetEmployeeManagers 6;  
GO  

При выполнении переменная может быть явно поименована.The variable can be explicitly named in the execution:

EXEC dbo.uspGetEmployeeManagers @EmployeeID = 6;  
GO  

Если приведенная инструкция является первой в пакете или скрипте osql или sqlcmd, то указывать EXEC не требуется.If the following is the first statement in a batch or an osql or sqlcmd script, EXEC is not required.

dbo.uspGetEmployeeManagers 6;  
GO  
--Or  
dbo.uspGetEmployeeManagers @EmployeeID = 6;  
GO  

Б.B. Передача нескольких аргументовUsing multiple parameters

В следующем примере выполняется хранимая процедура spGetWhereUsedProductID в базе данных AdventureWorks2012AdventureWorks2012.The following example executes the spGetWhereUsedProductID stored procedure in the AdventureWorks2012AdventureWorks2012 database. Передаются два параметра: код продукта 819 и дата проверки @CheckDate, со значением типа datetime.It passes two parameters: the first parameter is a product ID (819) and the second parameter, @CheckDate, is a datetime value.

DECLARE @CheckDate datetime;  
SET @CheckDate = GETDATE();  
EXEC dbo.uspGetWhereUsedProductID 819, @CheckDate;  
GO  

В.C. Использование EXECUTE tsql_string с переменнойUsing EXECUTE 'tsql_string' with a variable

Следующий пример показывает, как инструкция EXECUTE обрабатывает динамически построенные строки, содержащие переменные.The following example shows how EXECUTE handles dynamically built strings that contain variables. В примере производится создание курсора tables_cursor, в который помещается список всех пользовательских таблиц в базе данных AdventureWorks2012AdventureWorks2012, а затем на основе этого списка перестраиваются индексы всех таблиц.This example creates the tables_cursor cursor to hold a list of all user-defined tables in the AdventureWorks2012AdventureWorks2012 database, and then uses that list to rebuild all indexes on the tables.

DECLARE tables_cursor CURSOR  
   FOR  
   SELECT s.name, t.name   
   FROM sys.objects AS t  
   JOIN sys.schemas AS s ON s.schema_id = t.schema_id  
   WHERE t.type = 'U';  
OPEN tables_cursor;  
DECLARE @schemaname sysname;  
DECLARE @tablename sysname;  
FETCH NEXT FROM tables_cursor INTO @schemaname, @tablename;  
WHILE (@@FETCH_STATUS <> -1)  
BEGIN;  
   EXECUTE ('ALTER INDEX ALL ON ' + @schemaname + '.' + @tablename + ' REBUILD;');  
   FETCH NEXT FROM tables_cursor INTO @schemaname, @tablename;  
END;  
PRINT 'The indexes on all tables have been rebuilt.';  
CLOSE tables_cursor;  
DEALLOCATE tables_cursor;  
GO  
  

Г.D. Использование EXECUTE с удаленной хранимой процедуройUsing EXECUTE with a remote stored procedure

В следующем примере производится выполнение хранимой процедуры uspGetEmployeeManagers на удаленном сервере SQLSERVER1 и сохранение возвращенного состояния выполнения в переменной @retstat.The following example executes the uspGetEmployeeManagers stored procedure on the remote server SQLSERVER1 and stores the return status that indicates success or failure in @retstat.

Применимо к: с SQL Server 2008SQL Server 2008 до SQL Server 2019SQL Server 2019Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2019SQL Server 2019

DECLARE @retstat int;  
EXECUTE @retstat = SQLSERVER1.AdventureWorks2012.dbo.uspGetEmployeeManagers @BusinessEntityID = 6;  

Д.E. Использование в инструкции EXECUTE переменной хранимой процедурыUsing EXECUTE with a stored procedure variable

В следующем примере создается переменная, которая содержит имя хранимой процедуры.The following example creates a variable that represents a stored procedure name.

DECLARE @proc_name varchar(30);  
SET @proc_name = 'sys.sp_who';  
EXEC @proc_name;  
  

Е.F. Указание в инструкции EXECUTE ключевого слова DEFAULTUsing EXECUTE with DEFAULT

В следующем примере производится создание хранимой процедуры со значениями по умолчанию для первого и третьего аргументов.The following example creates a stored procedure with default values for the first and third parameters. При запуске эти значения вставляются в первый и третий аргументы, если они не переданы при вызове процедуры.When the procedure is run, these defaults are inserted for the first and third parameters when no value is passed in the call or when the default is specified. Обратите внимание, что ключевое слово DEFAULT может использоваться по-разному.Note the various ways the DEFAULT keyword can be used.

IF OBJECT_ID(N'dbo.ProcTestDefaults', N'P')IS NOT NULL  
   DROP PROCEDURE dbo.ProcTestDefaults;  
GO  
-- Create the stored procedure.  
CREATE PROCEDURE dbo.ProcTestDefaults (  
@p1 smallint = 42,   
@p2 char(1),   
@p3 varchar(8) = 'CAR')  
AS   
   SET NOCOUNT ON;  
   SELECT @p1, @p2, @p3  
;  
GO  
  

Хранимая процедура Proc_Test_Defaultsможет быть выполнена во множестве разных сочетаний.The Proc_Test_Defaults stored procedure can be executed in many combinations.

-- Specifying a value only for one parameter (@p2).  
EXECUTE dbo.ProcTestDefaults @p2 = 'A';  
-- Specifying a value for the first two parameters.  
EXECUTE dbo.ProcTestDefaults 68, 'B';  
-- Specifying a value for all three parameters.  
EXECUTE dbo.ProcTestDefaults 68, 'C', 'House';  
-- Using the DEFAULT keyword for the first parameter.  
EXECUTE dbo.ProcTestDefaults @p1 = DEFAULT, @p2 = 'D';  
-- Specifying the parameters in an order different from the order defined in the procedure.  
EXECUTE dbo.ProcTestDefaults DEFAULT, @p3 = 'Local', @p2 = 'E';  
-- Using the DEFAULT keyword for the first and third parameters.  
EXECUTE dbo.ProcTestDefaults DEFAULT, 'H', DEFAULT;  
EXECUTE dbo.ProcTestDefaults DEFAULT, 'I', @p3 = DEFAULT;  
  

Ж.G. Указание AT имя_связанного_сервера в инструкции EXECUTEUsing EXECUTE with AT linked_server_name

В следующем примере командная строка передается удаленному серверу.The following example passes a command string to a remote server. Создается связанный сервер SeattleSales, который указывает на другой экземпляр SQL ServerSQL Server, а затем на нем выполняется инструкция DDL (CREATE TABLE).It creates a linked server SeattleSales that points to another instance of SQL ServerSQL Server and executes a DDL statement (CREATE TABLE) against that linked server.

Применимо к: с SQL Server 2008SQL Server 2008 до SQL Server 2019SQL Server 2019Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2019SQL Server 2019

EXEC sp_addlinkedserver 'SeattleSales', 'SQL Server'  
GO  
EXECUTE ( 'CREATE TABLE AdventureWorks2012.dbo.SalesTbl   
(SalesID int, SalesName varchar(10)) ; ' ) AT SeattleSales;  
GO  

З.H. Использование инструкции EXECUTE с аргументом WITH RECOMPILEUsing EXECUTE WITH RECOMPILE

В следующем примере производится выполнение хранимой процедуры Proc_Test_Defaults с компиляцией нового плана запроса, который после выполнения модуля удаляется.The following example executes the Proc_Test_Defaults stored procedure and forces a new query plan to be compiled, used, and discarded after the module is executed.

EXECUTE dbo.Proc_Test_Defaults @p2 = 'A' WITH RECOMPILE;  
GO  

И.I. Выполнение определяемой пользователем функции с помощью инструкции EXECUTEUsing EXECUTE with a user-defined function

В следующем примере выполняется скалярная, определяемая пользователем функция ufnGetSalesOrderStatusText в базе данных AdventureWorks2012AdventureWorks2012.The following example executes the ufnGetSalesOrderStatusText scalar user-defined function in the AdventureWorks2012AdventureWorks2012 database. Возвращенное значение сохраняется в переменной @returnstatus.It uses the variable @returnstatus to store the value returned by the function. Функции передается один входной аргумент @Status,The function expects one input parameter, @Status. который имеет тип данных tinyint.This is defined as a tinyint data type.

DECLARE @returnstatus nvarchar(15);  
SET @returnstatus = NULL;  
EXEC @returnstatus = dbo.ufnGetSalesOrderStatusText @Status = 2;  
PRINT @returnstatus;  
GO  

К.J. Применение инструкции EXECUTE для запроса к базе данных Oracle на связанном сервереUsing EXECUTE to query an Oracle database on a linked server

Следующий пример демонстрирует выполнение нескольких инструкций SELECT на удаленном сервере Oracle.The following example executes several SELECT statements at the remote Oracle server. Пример начинается с добавления сервера Oracle в качестве связанного и создания имени входа на этом сервере.The example begins by adding the Oracle server as a linked server and creating linked server login.

Применимо к: с SQL Server 2008SQL Server 2008 до SQL Server 2019SQL Server 2019Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2019SQL Server 2019

-- Setup the linked server.  
EXEC sp_addlinkedserver    
        @server='ORACLE',  
        @srvproduct='Oracle',  
        @provider='OraOLEDB.Oracle',   
        @datasrc='ORACLE10';  
  
EXEC sp_addlinkedsrvlogin   
    @rmtsrvname='ORACLE',  
    @useself='false',   
    @locallogin=null,   
    @rmtuser='scott',   
    @rmtpassword='tiger';  
  
EXEC sp_serveroption 'ORACLE', 'rpc out', true;  
GO  
  
-- Execute several statements on the linked Oracle server.  
EXEC ( 'SELECT * FROM scott.emp') AT ORACLE;  
GO  
EXEC ( 'SELECT * FROM scott.emp WHERE MGR = ?', 7902) AT ORACLE;  
GO  
DECLARE @v INT;   
SET @v = 7902;  
EXEC ( 'SELECT * FROM scott.emp WHERE MGR = ?', @v) AT ORACLE;  
GO   

Л.K. Переключение контекста на другого пользователя с помощью инструкции EXECUTE AS USERUsing EXECUTE AS USER to switch context to another user

В следующем примере выполняется командная строка Transact-SQLTransact-SQL, которая создает таблицу и указывает предложение AS USER для переключения контекста выполнения инструкции с вызывающего на пользователя User1.The following example executes a Transact-SQLTransact-SQL string that creates a table and specifies the AS USER clause to switch the execution context of the statement from the caller to User1. При запуске инструкции компонент Компонент Database EngineDatabase Engine проверит разрешения пользователя User1.The Компонент Database EngineDatabase Engine will check the permissions of User1 when the statement is run. Пользователь User1 должен присутствовать в базе данных как пользователь и должен иметь разрешения на создание таблиц в схеме Sales; в противном случае инструкция завершается ошибкой.User1 must exist as a user in the database and must have permission to create tables in the Sales schema, or the statement fails.

EXECUTE ('CREATE TABLE Sales.SalesTable (SalesID int, SalesName varchar(10));')  
AS USER = 'User1';  
GO  

М.L. Использование параметра с командами AT имя_связанного_сервера и EXECUTEUsing a parameter with EXECUTE and AT linked_server_name

В следующем примере командная строка передается удаленному серверу со знаком вопроса (?) в качестве заполнителя для параметра.The following example passes a command string to a remote server by using a question mark (?) placeholder for a parameter. Пример создает связанный сервер SeattleSales, который указывает на другой экземпляр SQL ServerSQL Server, а затем выполняется инструкция SELECT по отношению к этому связанному серверу.The example creates a linked server SeattleSales that points to another instance of SQL ServerSQL Server and executes a SELECT statement against that linked server. Инструкция SELECT использует знак вопроса в качестве заполнителя для параметра ProductID (952), предоставляемого после инструкции.The SELECT statement uses the question mark as a place holder for the ProductID parameter (952), which is provided after the statement.

Применимо к: с SQL Server 2008SQL Server 2008 до SQL Server 2019SQL Server 2019Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2019SQL Server 2019

-- Setup the linked server.  
EXEC sp_addlinkedserver 'SeattleSales', 'SQL Server'  
GO  
-- Execute the SELECT statement.  
EXECUTE ('SELECT ProductID, Name   
    FROM AdventureWorks2012.Production.Product  
    WHERE ProductID = ? ', 952) AT SeattleSales;  
GO  

Н.M. Использование инструкции EXECUTE для переопределения одного результирующего набораUsing EXECUTE to redefine a single result set

В некоторых из предыдущих примеров выполнялась инструкция EXEC dbo.uspGetEmployeeManagers 6;, которая возвращала 7 столбцов.Some of the previous examples executed EXEC dbo.uspGetEmployeeManagers 6; which returned 7 columns. Следующий пример показывает использование синтаксиса WITH RESULT SET для изменения имени и типов данных возвращаемого результирующего набора.The following example demonstrates using the WITH RESULT SET syntax to change the names and data types of the returning result set.

Применимо к: с SQL Server 2012 (11.x)SQL Server 2012 (11.x) до SQL Server 2019SQL Server 2019, База данных SQL AzureAzure SQL DatabaseApplies to: SQL Server 2012 (11.x)SQL Server 2012 (11.x) through SQL Server 2019SQL Server 2019, База данных SQL AzureAzure SQL Database

EXEC uspGetEmployeeManagers 16  
WITH RESULT SETS  
(   
   ([Reporting Level] int NOT NULL,  
    [ID of Employee] int NOT NULL,  
    [Employee First Name] nvarchar(50) NOT NULL,  
    [Employee Last Name] nvarchar(50) NOT NULL,  
    [Employee ID of Manager] nvarchar(max) NOT NULL,  
    [Manager First Name] nvarchar(50) NOT NULL,  
    [Manager Last Name] nvarchar(50) NOT NULL )  
);  
  

О.N. Использование инструкции EXECUTE для переопределения двух результирующих наборовUsing EXECUTE to redefine a two result sets

При выполнении инструкции, возвращающей более одного результирующего набора, необходимо определить каждый из ожидаемых результирующих наборов.When executing a statement that returns more than one result set, define each expected result set. В следующем примере в AdventureWorks2012AdventureWorks2012 создается процедура, которая возвращает два результирующих набора.The following example in AdventureWorks2012AdventureWorks2012 creates a procedure that returns two result sets. Затем процедура выполняется с предложением WITH RESULT SETS и указывается два определения результирующих наборов.Then the procedure is executed using the WITH RESULT SETS clause, and specifying two result set definitions.

Применимо к: с SQL Server 2012 (11.x)SQL Server 2012 (11.x) до SQL Server 2019SQL Server 2019, База данных SQL AzureAzure SQL DatabaseApplies to: SQL Server 2012 (11.x)SQL Server 2012 (11.x) through SQL Server 2019SQL Server 2019, База данных SQL AzureAzure SQL Database

--Create the procedure  
CREATE PROC Production.ProductList @ProdName nvarchar(50)  
AS  
-- First result set  
SELECT ProductID, Name, ListPrice  
    FROM Production.Product  
    WHERE Name LIKE @ProdName;  
-- Second result set   
SELECT Name, COUNT(S.ProductID) AS NumberOfOrders  
    FROM Production.Product AS P  
    JOIN Sales.SalesOrderDetail AS S  
        ON P.ProductID  = S.ProductID   
    WHERE Name LIKE @ProdName  
    GROUP BY Name;  
GO  
  
-- Execute the procedure   
EXEC Production.ProductList '%tire%'  
WITH RESULT SETS   
(  
    (ProductID int,   -- first result set definition starts here  
    Name Name,  
    ListPrice money)  
    ,                 -- comma separates result set definitions  
    (Name Name,       -- second result set definition starts here  
    NumberOfOrders int)  
);  
  

Примеры: Azure Synapse Analytics (хранилище данных SQL)Azure Synapse Analytics (SQL DW) и Параллельное хранилище данныхParallel Data WarehouseExamples: Azure Synapse Analytics (хранилище данных SQL)Azure Synapse Analytics (SQL DW) and Параллельное хранилище данныхParallel Data Warehouse

Пример П. Выполнение основной процедурыExample O: Basic Procedure Execution

Выполнение хранимой процедуры:Executing a stored procedure:

EXEC proc1;  

Вызов хранимой процедуры с именем, определенным во время выполнения:Calling a stored procedure with name determined at runtime:

EXEC ('EXEC ' + @var);  

Вызов хранимой процедуры из хранимой процедуры:Calling a stored procedure from within a stored procedure:

CREATE sp_first AS EXEC sp_second; EXEC sp_third;  

Пример Р. Выполнение строкExample P: Executing Strings

Выполнение строки SQL:Executing a SQL string:

EXEC ('SELECT * FROM sys.types');  

Выполнение вложенной строки:Executing a nested string:

EXEC ('EXEC (''SELECT * FROM sys.types'')');  

Выполнение строковой переменной:Executing a string variable:

DECLARE @stringVar nvarchar(100);  
SET @stringVar = N'SELECT name FROM' + ' sys.sql_logins';  
EXEC (@stringVar);  

Пример С. Процедуры с параметрамиExample Q: Procedures with Parameters

В следующем примере создается процедура с параметрами и демонстрируется три способа выполнения процедуры.The following example creates a procedure with parameters and demonstrates 3 ways to execute the procedure:

-- Uses AdventureWorks  
  
CREATE PROC ProcWithParameters  
    @name nvarchar(50),  
@color nvarchar (15)  
AS   
SELECT ProductKey, EnglishProductName, Color FROM [dbo].[DimProduct]  
WHERE EnglishProductName LIKE @name  
AND Color = @color;  
GO  
  
-- Executing using positional parameters  
EXEC ProcWithParameters N'%arm%', N'Black';  
-- Executing using named parameters in order  
EXEC ProcWithParameters @name = N'%arm%', @color = N'Black';  
-- Executing using named parameters out of order  
EXEC ProcWithParameters @color = N'Black', @name = N'%arm%';  
GO  

См. также:See Also

@@NESTLEVEL (Transact-SQL) @@NESTLEVEL (Transact-SQL)
DECLARE @local_variable (Transact-SQL) DECLARE @local_variable (Transact-SQL)
Предложение EXECUTE AS (Transact-SQL) EXECUTE AS Clause (Transact-SQL)
Программа osql osql Utility
Участники (ядро СУБД) Principals (Database Engine)
REVERT (Transact-SQL) REVERT (Transact-SQL)
sp_addlinkedserver (Transact-SQL) sp_addlinkedserver (Transact-SQL)
Программа sqlcmd sqlcmd Utility
SUSER_NAME (Transact-SQL) SUSER_NAME (Transact-SQL)
sys.database_principals (Transact-SQL) sys.database_principals (Transact-SQL)
sys.server_principals (Transact-SQL) sys.server_principals (Transact-SQL)
USER_NAME (Transact-SQL) USER_NAME (Transact-SQL)
OPENDATASOURCE (Transact-SQL) OPENDATASOURCE (Transact-SQL)
Скалярные пользовательские функции для выполняющейся в памяти OLTPScalar User-Defined Functions for In-Memory OLTP