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

APLICA-SE A: simSQL Server simBanco de Dados SQL do Azure simAzure Synapse Analytics (SQL DW) simParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure Synapse Analytics (SQL DW) yesParallel Data Warehouse

Executa uma cadeia de caracteres de comando, uma cadeia de caracteres em um lote Transact-SQLTransact-SQL ou um dos seguintes módulos: procedimento armazenado do sistema, procedimento armazenado definido pelo usuário, procedimento armazenado CLR, função de valor escalar definida pelo usuário ou procedimento armazenado estendido.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. A instrução EXECUTE pode ser usada para enviar comandos de passagem aos servidores vinculados.The EXECUTE statement can be used to send pass-through commands to linked servers. Além disso, o contexto no qual uma cadeia de caracteres ou comando é executado pode ser definido explicitamente.Additionally, the context in which a string or command is executed can be explicitly set. É possível definir metadados para o conjunto de resultados usando as opções do WITH RESULT SETS.Metadata for the result set can be defined by using the WITH RESULT SETS options.

Importante

Antes de chamar EXECUTE com uma cadeia de caracteres, valide a cadeia de caracteres.Before you call EXECUTE with a character string, validate the character string. Nunca execute um comando construído por uma entrada de usuário que não foi validada.Never execute a command constructed from user input that has not been validated.

Ícone de link do tópico Convenções de sintaxe de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxeSyntax

-- 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 ] )  
[;]  

ArgumentosArguments

@return_status@return_status
É uma variável de inteiro opcional que armazena o status de retorno de um módulo.Is an optional integer variable that stores the return status of a module. Essa variável deve ser declarada no lote, procedimento armazenado ou função para ser usada antes em uma instrução EXECUTE.This variable must be declared in the batch, stored procedure, or function before it is used in an EXECUTE statement.

Quando usada para invocar uma função definida pelo usuário com valor escalar, a variável @return_status pode ser de qualquer tipo de dados escalar.When used to invoke a scalar-valued user-defined function, the @return_status variable can be of any scalar data type.

module_namemodule_name
É o nome totalmente qualificado do procedimento armazenado ou do valor escalar da função a ser chamada, definida pelo usuário.Is the fully qualified or nonfully qualified name of the stored procedure or scalar-valued user-defined function to call. Os nomes de módulos devem obedecer às regras de identificadores.Module names must comply with the rules for identifiers. Os nomes de procedimentos armazenados estendidos sempre têm diferenciação entre maiúsculas e minúsculas, independentemente da ordenação do servidor.The names of extended stored procedures are always case-sensitive, regardless of the collation of the server.

Um módulo que tenha sido criado em outro banco de dados poderá ser executado se o usuário que estiver executando o módulo for o proprietário ou se tiver permissão apropriada para executá-lo no referido banco de dados.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. Um módulo poderá ser executado em outro servidor que executa SQL ServerSQL Server se o usuário que estiver executando o módulo tiver a permissão apropriada para usar esse servidor (acesso remoto) e executar o módulo no referido banco de dados.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. Se você especificar um nome de servidor mas não especificar um nome de banco de dados, o Mecanismo de Banco de Dados do SQL ServerSQL Server Database Engine procurará o módulo no banco de dados padrão do usuário.If a server name is specified but no database name is specified, the Mecanismo de Banco de Dados do SQL ServerSQL Server Database Engine looks for the module in the default database of the user.

;number;number
Aplica-se a: do SQL Server 2008SQL Server 2008 ao SQL Server 2019SQL Server 2019Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2019SQL Server 2019

É um inteiro opcional usado para agrupar procedimentos do mesmo nome.Is an optional integer that is used to group procedures of the same name. Esse parâmetro não é usado para procedimentos armazenados estendidos.This parameter is not used for extended stored procedures.

Observação

Este recurso está em modo de manutenção e talvez seja removido em uma versão futura do Microsoft SQL Server.This feature is in maintenance mode and may be removed in a future version of Microsoft SQL Server. Evite usar esse recurso em desenvolvimentos novos e planeje modificar os aplicativos que atualmente o utilizam.Avoid using this feature in new development work, and plan to modify applications that currently use this feature.

Para obter mais informações sobre grupos de procedimentos, consulte CREATE PROCEDURE (Transact-SQL).For more information about procedure groups, see CREATE PROCEDURE (Transact-SQL).

@module_name_var@module_name_var
É o nome de uma variável localmente definida que representa um nome de módulo.Is the name of a locally defined variable that represents a module name.

Isso pode ser uma variável que contém o nome de uma função escalar definida pelo usuário compilada nativamente.This can be a variable that holds the name of a natively compiled, scalar user-defined function.

@parameter@parameter
É o parâmetro do module_name, conforme definido no módulo.Is the parameter for module_name, as defined in the module. Os nomes de parâmetro devem ser precedidos pelo sinal de arroba (@).Parameter names must be preceded by the at sign (@). Quando usados com o formato @parameter_name=value, os nomes de parâmetro e constantes não precisam ser fornecidos na ordem em que são definidos no módulo.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. Porém, se o formato @parameter_name=value for usado para um parâmetro, ele deverá ser usado para todos os parâmetros seguintes.However, if the @parameter_name=value form is used for any parameter, it must be used for all subsequent parameters.

Por padrão, os parâmetros são anuláveis.By default, parameters are nullable.

valuevalue
É o valor do parâmetro a ser informado ao módulo ou comando de passagem.Is the value of the parameter to pass to the module or pass-through command. Se não forem especificados nomes de parâmetro, os valores de parâmetro deverão ser fornecidos na ordem definida no módulo.If parameter names are not specified, parameter values must be supplied in the order defined in the module.

Na execução dos comandos de passagem em servidores vinculados, a ordem dos valores de parâmetro dependerá do provedor OLE DB do servidor vinculado.When executing pass-through commands against linked servers, the order of the parameter values depends on the OLE DB provider of the linked server. A maioria dos provedores OLE DB associa valores para os parâmetros da esquerda para a direita.Most OLE DB providers bind values to parameters from left to right.

Se o valor de um parâmetro for o nome de um objeto, cadeia de caracteres ou qualificado por um nome de esquema ou nome de banco de dados, o nome todo deverá ficar dentro de aspas simples.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. Se o valor de um parâmetro for uma palavra-chave, a palavra-chave deverá ficar dentro de aspas duplas.If the value of a parameter is a keyword, the keyword must be enclosed in double quotation marks.

Se você passar uma única palavra que não começa com @ e que não está entre aspas, por exemplo, se você esquecer @ em um nome de parâmetro, a palavra será tratada como uma cadeia de caracteres nvarchar, apesar das aspas ausentes.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.

Se um padrão estiver definido no módulo, um usuário poderá executar o módulo sem especificar um parâmetro.If a default is defined in the module, a user can execute the module without specifying a parameter.

O padrão também pode ser NULL.The default can also be NULL. Geralmente, a definição de módulo especificará a ação a ser tomada se um valor de parâmetro for NULL.Generally, the module definition specifies the action that should be taken if a parameter value is NULL.

@variable@variable
É a variável que armazena um parâmetro ou um parâmetro de retorno.Is the variable that stores a parameter or a return parameter.

OUTPUTOUTPUT
Especifica que o módulo ou a cadeia de caracteres de comando deve retornar um parâmetro.Specifies that the module or command string returns a parameter. O parâmetro correspondente no módulo ou na cadeia de caracteres de comando também deve ter sido criado com o uso da palavra-chave OUTPUT.The matching parameter in the module or command string must also have been created by using the keyword OUTPUT. Use essa palavra-chave quando você usar variáveis de cursor como parâmetros.Use this keyword when you use cursor variables as parameters.

Se value for definido como OUTPUT de um módulo executado em um servidor vinculado, as alterações feitas no @parameter correspondente pelo Provedor OLE DB serão copiadas novamente para a variável no final da execução do módulo.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.

Se os parâmetros OUTPUT estiverem sendo usados e a intenção for usar os valores retornados em outras instruções no lote ou módulo de chamada, o valor do parâmetro deverá ser passado como uma variável, como @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. Não é possível executar um módulo especificando OUTPUT para um parâmetro que não esteja definido como OUTPUT no módulo.You cannot execute a module by specifying OUTPUT for a parameter that is not defined as an OUTPUT parameter in the module. Não é possível passar constantes ao módulo usando OUTPUT; o parâmetro de retorno requer um nome de variável.Constants cannot be passed to module by using OUTPUT; the return parameter requires a variable name. O tipo de dados da variável deve ser declarado e ter um valor atribuído antes da execução do procedimento.The data type of the variable must be declared and a value assigned before executing the procedure.

Quando EXECUTE é usado em um procedimento armazenado remoto ou para executar um comando de passagem em um servidor vinculado, os parâmetros OUTPUT não podem ser nenhum dos tipos de dados LOB (objeto grande).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.

Os parâmetros de retorno podem ser de qualquer tipo de dados, exceto os tipos de dados LOB.Return parameters can be of any data type except the LOB data types.

DEFAULTDEFAULT
Fornece o valor padrão do parâmetro como definido no módulo.Supplies the default value of the parameter as defined in the module. Quando o módulo esperar um valor para um parâmetro que não tem um padrão definido e houver um parâmetro ausente ou a palavra-chave DEFAULT estiver especificada, ocorrerá um erro.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
É o nome de uma variável local.Is the name of a local variable. @string_variable pode ser qualquer tipo de dados char, varchar, nchar ou nvarchar. @string_variable can be any char, varchar, nchar, or nvarchar data type. Incluem os tipos de dados (max) .These include the (max) data types.

[N] 'tsql_string'[N] 'tsql_string'
É uma cadeia de caracteres constante.Is a constant string. tsql_string pode ser qualquer tipo de dados nvarchar ou varchar.tsql_string can be any nvarchar or varchar data type. Se N for incluído, a cadeia de caracteres será interpretada como o tipo de dados nvarchar.If the N is included, the string is interpreted as nvarchar data type.

AS <context_specification>AS <context_specification>
Especifica o contexto no qual a instrução é executada.Specifies the context in which the statement is executed.

LogonLOGIN
Aplica-se a: do SQL Server 2008SQL Server 2008 ao SQL Server 2019SQL Server 2019Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2019SQL Server 2019

Especifica que o contexto para ser representado é um logon.Specifies the context to be impersonated is a login. O escopo de personificação é o servidor.The scope of impersonation is the server.

UsuárioUSER
Especifica que o contexto a ser representado é um usuário no banco de dados atual.Specifies the context to be impersonated is a user in the current database. O escopo de representação é restrito ao banco de dados atual.The scope of impersonation is restricted to the current database. Uma opção de contexto para um usuário de banco de dados não herda as permissões em nível de servidor desse usuário.A context switch to a database user does not inherit the server-level permissions of that user.

Importante

Enquanto a opção de contexto para o usuário do banco de dados estiver ativa, qualquer tentativa de acessar os recursos fora do banco de dados causará a falha da instrução.While the context switch to the database user is active, any attempt to access resources outside the database will cause the statement to fail. Isso inclui instruções USE database, consultas distribuídas e consultas que referenciam outro banco de dados usando identificadores de três ou quatro partes.This includes USE database statements, distributed queries, and queries that reference another database by using three- or four-part identifiers.

'name''name'
É um usuário ou nome de logon válido.Is a valid user or login name. name deve ser membro da função de servidor fixa sysadmin ou existir como uma entidade de segurança em sys.database_principals ou sys.server_principals, respectivamente.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 não pode ser uma conta interna, como NT AUTHORITY\LocalService, NT AUTHORITY\NetworkService ou NT AUTHORITY\LocalSystem.name cannot be a built-in account, such as NT AUTHORITY\LocalService, NT AUTHORITY\NetworkService, or NT AUTHORITY\LocalSystem.

Para obter mais informações, consulte Especificando um nome de logon ou usuário mais adiante neste tópico.For more information, see Specifying a User or Login Name later in this topic.

[N] 'command_string'[N] 'command_string'
É uma cadeia de caracteres constante que contém o comando a ser passado ao servidor vinculado.Is a constant string that contains the command to be passed through to the linked server. Se N for incluído, a cadeia de caracteres será interpretada como o tipo de dados nvarchar.If the N is included, the string is interpreted as nvarchar data type.

[?][?]
Indica parâmetros para os quais valores são fornecidos em <arg-list> de comandos de passagem usados em uma instrução 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
Aplica-se a: do SQL Server 2008SQL Server 2008 ao SQL Server 2019SQL Server 2019Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2019SQL Server 2019

Especifica que command_string é executada em linked_server_name e os resultados, se houver, são retornados ao cliente.Specifies that command_string is executed against linked_server_name and results, if any, are returned to the client. linked_server_name deve referenciar uma definição de servidor vinculado existente no servidor local.linked_server_name must refer to an existing linked server definition in the local server. Os servidores vinculados são definidos por meio de sp_addlinkedserver.Linked servers are defined by using sp_addlinkedserver.

WITH <execute_option>WITH <execute_option>
Opções de execução possíveis.Possible execute options. As opções de RESULT SETS não podem ser especificadas em uma instrução INSERT...EXEC.The RESULT SETS options cannot be specified in an INSERT...EXEC statement.

TermoTerm DefiniçãoDefinition
RECOMPILERECOMPILE Força a compilação, a utilização e o descarte de um novo plano após a execução do módulo.Forces a new plan to be compiled, used, and discarded after the module is executed. Se houver um plano de consulta existente para o módulo, esse plano permanecerá no cache.If there is an existing query plan for the module, this plan remains in the cache.

Use essa opção se o parâmetro sendo fornecido for atípico ou se os dados tiverem sido alterados significativamente.Use this option if the parameter you are supplying is atypical or if the data has significantly changed. Ela não é usada para procedimentos armazenados estendidos.This option is not used for extended stored procedures. É aconselhável usar essa opção se realmente for necessário porque ela é expansiva.We recommend that you use this option sparingly because it is expensive.

Observação: Não é possível usar WITH RECOMPILE ao chamar um procedimento armazenado que usa a sintaxe OPENDATASOURCE.Note: You can not use WITH RECOMPILE when calling a stored procedure that uses OPENDATASOURCE syntax. A opção WITH RECOMPILE será ignorada quando um nome de objeto de quatro partes for especificado.The WITH RECOMPILE option is ignored when a four-part object name is specified.

Observação: RECOMPILE não é compatível com funções escalares definidas pelo usuário compiladas nativamente.Note: RECOMPILE is not supported with natively compiled, scalar user-defined functions. Se precisar recompilar, use sp_recompile (Transact-SQL).If you need to recompile, use sp_recompile (Transact-SQL).
RESULT SETS UNDEFINEDRESULT SETS UNDEFINED Aplica-se a: SQL Server 2012 (11.x)SQL Server 2012 (11.x) a SQL Server 2019SQL Server 2019, Banco de dados SQL do AzureAzure SQL Database.Applies to: SQL Server 2012 (11.x)SQL Server 2012 (11.x) through SQL Server 2019SQL Server 2019, Banco de dados SQL do AzureAzure SQL Database.

Esta opção não fornece nenhuma garantia de quais resultados, se houver, serão retornados. Além disso, não é fornecida nenhuma definição.This option provides no guarantee of what results, if any, will be returned, and no definition is provided. A instrução é executada sem erro se algum resultado for retornado ou se nenhum resultado for retornado.The statement executes without error if any results are returned or no results are returned. RESULT SETS UNDEFINED será o comportamento padrão se não for fornecido result_sets_option.RESULT SETS UNDEFINED is the default behavior if a result_sets_option is not provided.

Para funções escalares interpretadas definidas pelo usuário e funções escalares compiladas nativamente definidas pelo usuário, essa opção não funciona porque as funções nunca retornam um conjunto de resultados.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 Aplica-se a: SQL Server 2012 (11.x)SQL Server 2012 (11.x) a SQL Server 2019SQL Server 2019, Banco de dados SQL do AzureAzure SQL Database.Applies to: SQL Server 2012 (11.x)SQL Server 2012 (11.x) through SQL Server 2019SQL Server 2019, Banco de dados SQL do AzureAzure SQL Database.

Garante que a instrução execute não retornará nenhum resultado.Guarantees that the execute statement will not return any results. Se algum resultado for retornado, o lote será anulado.If any results are returned the batch is aborted.

Para funções escalares interpretadas definidas pelo usuário e funções escalares compiladas nativamente definidas pelo usuário, essa opção não funciona porque as funções nunca retornam um conjunto de resultados.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> Aplica-se a: SQL Server 2012 (11.x)SQL Server 2012 (11.x) a SQL Server 2019SQL Server 2019, Banco de dados SQL do AzureAzure SQL Database.Applies to: SQL Server 2012 (11.x)SQL Server 2012 (11.x) through SQL Server 2019SQL Server 2019, Banco de dados SQL do AzureAzure SQL Database.

Fornece uma garantia de que o resultado voltará como especificado em result_sets_definition.Provides a guarantee that the result will come back as specified in the result_sets_definition. Para instruções que retornam vários conjuntos de resultados, forneça várias seções de result_sets_definition.For statements that return multiple result sets, provide multiple result_sets_definition sections. Coloque cada result_sets_definition entre parênteses, separada por vírgulas.Enclose each result_sets_definition in parentheses, separated by commas. Para obter mais informações, consulte <result_sets_definition > mais adiante neste tópico.For more information, see <result_sets_definition> later in this topic.

Essa opção sempre resulta em um erro para funções escalares definidas pelo usuário compiladas nativamente, porque as funções não retornam um conjunto de resultados.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> Aplica-se a: do SQL Server 2012 (11.x)SQL Server 2012 (11.x) ao SQL Server 2019SQL Server 2019, Banco de dados SQL do AzureAzure SQL Database<result_sets_definition> Applies to: SQL Server 2012 (11.x)SQL Server 2012 (11.x) through SQL Server 2019SQL Server 2019, Banco de dados SQL do AzureAzure SQL Database

Descreve os conjuntos de resultados retornados pelas instruções executadas.Describes the result sets returned by the executed statements. As cláusulas de result_sets_definition têm o seguinte significadoThe clauses of the result_sets_definition have the following meaning

TermoTerm DefiniçãoDefinition
{{

column_namecolumn_name

data_typedata_type

[ COLLATE collation_name][ COLLATE collation_name]

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

}}
Veja a tabela abaixo.See the table below.
db_namedb_name O nome do banco de dados que contém a tabela, a exibição ou a função com valor de tabela.The name of the database containing the table, view or table valued function.
schema_nameschema_name O nome do esquema proprietário da tabela, da exibição ou da função com valor de tabela.The name of the schema owning the table, view or table valued function.
table_name | view_name | table_valued_function_nametable_name | view_name | table_valued_function_name Especifica que as colunas retornadas serão as especificadas na tabela, exibição ou função com valor de tabela nomeada.Specifies that the columns returned will be those specified in the table, view or table valued function named. Não há suporte para variáveis de tabela, tabelas temporárias e sinônimos na sintaxe de objetos do 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 Especifica que as colunas retornadas serão as especificadas no tipo de tabela.Specifies that the columns returned will be those specified in the table type.
AS FOR XMLAS FOR XML Especifica que os resultados XML da instrução ou procedimento armazenado chamado pela instrução EXECUTE serão convertidos no formato como se fossem gerados por uma instrução 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. Toda a formatação das políticas do tipo na instrução original é removida, e os resultados são retornados como se nenhuma política do tipo fosse especificada.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 não converte em XML os resultados de tabela não XML da instrução executada ou do procedimento armazenado.AS FOR XML does not convert non-XML tabular results from the executed statement or stored procedure into XML.
TermoTerm DefiniçãoDefinition
column_namecolumn_name Os nomes de cada coluna.The names of each column. Se o número de colunas for diferente do conjunto de resultados, ocorrerá um erro e o lote será anulado.If the number of columns differs from the result set, an error occurs and the batch is aborted. Se o nome de uma coluna for diferente do conjunto de resultados, o nome de coluna retornado será definido como o nome definido.If the name of a column differs from the result set, the column name returned will be set to the name defined.
data_typedata_type Os tipos de dados de cada coluna.The data types of each column. Se os tipos de dados forem diferentes, será executada uma conversão implícita para o tipo de dados definido.If the data types differ, an implicit conversion to the defined data type is performed. Se a conversão falhar, o lote será anuladoIf the conversion fails the batch is aborted
COLLATE collation_nameCOLLATE collation_name A ordenação de cada coluna.The collation of each column. Se houver uma incompatibilidade de ordenação, será tentada uma ordenação implícita.If there is a collation mismatch, an implicit collation is attempted. Se isso falhar, o lote será anulado.If that fails, the batch is aborted.
NULL | NOT NULLNULL | NOT NULL A nulidade de cada coluna.The nullability of each column. Se a nulidade definida for NOT NULL e os dados retornados contiver NULLs, ocorrerá um erro e o lote será anulado.If the defined nullability is NOT NULL and the data returned contains NULLs an error occurs and the batch is aborted. Se não especificado, o valor padrão se conforma à configuração das opções do ANSI_NULL_DFLT_ON e 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.

O conjunto de resultados real retornado durante execução pode diferir do resultado definido usando a cláusula WITH RESULT SETS de uma das seguintes maneiras: número de conjuntos de resultados, número de colunas, nome de coluna, nulidade e tipo de dados.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. Se o número de conjuntos de resultados for diferente, ocorrerá um erro e o lote será anulado.If the number of result sets differs, an error occurs and the batch is aborted.

RemarksRemarks

Os parâmetros podem ser fornecidos com value ou @parameter_name=value.Parameters can be supplied either by using value or by using @parameter_name=value. . Um parâmetro não faz parte de uma transação; portanto, se um parâmetro for alterado em uma transação que for posteriormente revertida, o parâmetro não será revertido para seu valor anterior.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. O valor retornado ao chamador será sempre o valor no momento do retorno do módulo.The value returned to the caller is always the value at the time the module returns.

O aninhamento ocorre quando um módulo chama outro ou executa código gerenciado, fazendo referência a um módulo CLR (Common Language Runtime) a um tipo definido pelo usuário ou agregação.Nesting occurs when one module calls another or executes managed code by referencing a common language runtime (CLR) module, user-defined type, or aggregate. O nível de aninhamento é aumentado quando o módulo chamado ou a referência de código gerenciado inicia a execução e diminuído quando ela termina.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. Exceder o máximo de 32 níveis de aninhamento faz com que toda a cadeia de chamada falhe.Exceeding the maximum of 32 nesting levels causes the complete calling chain to fail. O nível de aninhamento atual é armazenado na função do sistema @@NESTLEVEL.The current nesting level is stored in the @@NESTLEVEL system function.

Como os procedimentos armazenados remotos e estendidos não estão no escopo de uma transação (a menos que emitidos em uma instrução BEGIN DISTRIBUTED TRANSACTION ou quando usados com várias opções de configuração), os comandos executados por meio de chamadas a eles não poderão ser revertidos.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. Para obter mais informações, consulte Procedimentos armazenados do sistema (Transact-SQL) e BEGIN DISTRIBUTED TRANSACTION (Transact-SQL).For more information, see System Stored Procedures (Transact-SQL) and BEGIN DISTRIBUTED TRANSACTION (Transact-SQL).

Ao utilizar variáveis de cursor, se você executar um procedimento que passe em uma variável de cursor com um cursor alocado a ele, ocorrerá um erro.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.

Não é necessário especificar a palavra-chave EXECUTE durante a execução de módulos se a instrução for a primeira em um lote.You do not have to specify the EXECUTE keyword when executing modules if the statement is the first one in a batch.

Para obter informações adicionais específicas de procedimentos armazenados CLR, consulte Procedimentos armazenados CLR.For additional information specific to CLR stored procedures, see CLR Stored Procedures.

Usando EXECUTE com procedimentos armazenadosUsing EXECUTE with Stored Procedures

Não será preciso especificar a palavra-chave EXECUTE durante a execução de procedimentos armazenados quando a instrução for a primeira em um lote.You do not have to specify the EXECUTE keyword when you execute stored procedures when the statement is the first one in a batch.

Procedimentos armazenados do sistema SQL ServerSQL Server iniciam com os caracteres sp_.SQL ServerSQL Server system stored procedures start with the characters sp_. Eles estão fisicamente armazenados no banco de dados Resource, mas são exibidos logicamente no esquema sys de cada sistema e banco de dados definido pelo usuário.They are physically stored in the Resource database, but logically appear in the sys schema of every system and user-defined database. Quando você executa um procedimento armazenado de sistema, em um lote ou dentro de um módulo, como a função ou o procedimento armazenado definido pelo usuário, recomendamos qualificar o nome do procedimento armazenado com o nome do esquema 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.

Os procedimentos armazenados estendidos de sistema SQL ServerSQL Server iniciam com os caracteres xp_ e estão contidos no esquema dbo do banco de dados mestre.SQL ServerSQL Server system extended stored procedures start with the characters xp_, and these are contained in the dbo schema of the master database. Quando você executa um procedimento armazenado estendido de sistema, em um lote ou dentro de um módulo, como a função ou o procedimento armazenado definido pelo usuário, recomendamos qualificar o nome do procedimento armazenado com 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.

Quando você executa um procedimento definido pelo usuário, em um lote ou dentro de um módulo, como a função ou o procedimento armazenado definido pelo usuário, recomendamos qualificar o nome do procedimento armazenado com um nome de esquema.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. Não recomendamos nomear um procedimento armazenado definido pelo usuário com o mesmo nome de uma procedimento armazenado no sistema.We do not recommend that you name a user-defined stored procedure with the same name as a system stored procedure. Para obter mais informações sobre a execução de procedimentos armazenados, consulte Executar um procedimento armazenado.For more information about executing stored procedures, see Execute a Stored Procedure.

Usando EXECUTE com uma cadeia de caracteresUsing EXECUTE with a Character String

Em versões anteriores de SQL ServerSQL Server, as cadeias de caracteres estão limitadas a 8.000 bytes.In earlier versions of SQL ServerSQL Server, character strings are limited to 8,000 bytes. Isso requer a concatenação de cadeias de caracteres grandes para execução dinâmica.This requires concatenating large strings for dynamic execution. No SQL ServerSQL Server, os tipos de dados varchar(max) e nvarchar(max) podem ser especificados para permitir que as cadeias de caracteres tenham até 2 gigabytes de dados.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.

As alterações no contexto de banco de dados duram apenas até o fim da instrução EXECUTE.Changes in database context last only until the end of the EXECUTE statement. Por exemplo, depois que EXEC na instrução seguinte é executado, o contexto de banco de dados se torna o mestre.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;');  

Alternância de contextoContext Switching

Você pode usar a cláusula AS { LOGIN | USER } = ' name ' para alternar o contexto de execução de uma instrução dinâmica.You can use the AS { LOGIN | USER } = ' name ' clause to switch the execution context of a dynamic statement. Quando a alternância de contexto for especificada como EXECUTE ('string') AS <context_specification>, a duração dessa alternância estará limitada ao escopo da consulta sendo executada.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.

Especificando um nome de logon ou usuárioSpecifying a User or Login Name

O nome de logon ou de usuário especificado em AS { LOGIN | USER } = ' name ' deve existir como principal em sys.database_principals ou sys.server_principals, respectivamente, ou a instrução falhará.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. Além disso, as permissões IMPERSONATE devem ser concedidas na entidade de segurança.Additionally, IMPERSONATE permissions must be granted on the principal. A menos que o chamador seja o proprietário do banco de dados ou membro da função de servidor fixa sysadmin, o principal deverá existir quando o usuário estiver acessando o banco de dados ou a instância de SQL ServerSQL Server por meio de uma associação de grupo do 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. Por exemplo, considere as seguintes condições:For example, assume the following conditions:

  • O grupo CompanyDomain\SQLUsers tem acesso ao banco de dados de vendas.CompanyDomain\SQLUsers group has access to the Sales database.

  • CompanyDomain\SqlUser1 é membro de SQLUsers e, por isso, tem acesso implícito ao banco de dados de vendas.CompanyDomain\SqlUser1 is a member of SQLUsers and, therefore, has implicit access to the Sales database.

Embora CompanyDomain\SqlUser1 tenha acesso ao banco de dados por meio da associação ao grupo SQLUsers, a instrução EXECUTE @string_variable AS USER = 'CompanyDomain\SqlUser1' falhará porque CompanyDomain\SqlUser1 não existe como uma entidade de segurança no banco de dados.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.

Práticas recomendadasBest Practices

Especifique um logon ou um usuário que tenha os privilégios mínimos necessários para executar as operações definidas na instrução ou módulo.Specify a login or user that has the least privileges required to perform the operations that are defined in the statement or module. Por exemplo, não especifique um nome de logon que tenha permissões em nível de servidor se apenas as permissões em nível de banco de dados forem necessárias; ou não especifique uma conta de proprietário de banco de dados, a menos que essas permissões sejam solicitadas.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.

PermissõesPermissions

Não são solicitadas permissões para executar a instrução EXECUTE.Permissions are not required to run the EXECUTE statement. Porém, são solicitadas permissões nos protegíveis mencionados na cadeia de caracteres EXECUTE.However, permissions are required on the securables that are referenced within the EXECUTE string. Por exemplo, se a cadeia de caracteres tiver uma instrução INSERT, o chamador da instrução EXECUTE deverá ter a permissão INSERT na tabela de destino.For example, if the string contains an INSERT statement, the caller of the EXECUTE statement must have INSERT permission on the target table. As permissões são verificadas quando a instrução EXECUTE for encontrada, mesmo se ela estiver incluída em um módulo.Permissions are checked at the time EXECUTE statement is encountered, even if the EXECUTE statement is included within a module.

As permissões EXECUTE de um padrão de módulo para o proprietário do módulo, que pode transferi-las a outros usuários.EXECUTE permissions for a module default to the owner of the module, who can transfer them to other users. Quando um módulo que executa uma cadeia de caracteres é executado, as permissões são verificadas no contexto do usuário que executa o módulo e não no contexto do usuário que o criou.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. Entretanto, se o mesmo usuário for proprietário do módulo chamador e do módulo sendo chamado, a verificação da permissão EXECUTE não será feita para o segundo módulo.However, if the same user owns the calling module and the module being called, EXECUTE permission checking is not performed for the second module.

Se o módulo acessar outros objetos de banco de dados, a execução ocorrerá quando a permissão EXECUTE estiver no módulo e uma das seguintes condições for verdadeira:If the module accesses other database objects, execution succeeds when you have EXECUTE permission on the module and one of the following is true:

  • O módulo está marcado como EXECUTE AS USER ou SELF, e o seu proprietário tem as permissões correspondentes no objeto mencionado.The module is marked EXECUTE AS USER or SELF, and the module owner has the corresponding permissions on the referenced object. Para obter mais informações sobre a representação dentro de um módulo, consulte Cláusula EXECUTE AS (Transact-SQL).For more information about impersonation within a module, see EXECUTE AS Clause (Transact-SQL).

  • O módulo está marcado como EXECUTE AS CALLER e você tem as permissões correspondentes no objeto.The module is marked EXECUTE AS CALLER, and you have the corresponding permissions on the object.

  • O módulo está marcado como EXECUTE AS user_name, e user_name tem as permissões correspondentes no objeto.The module is marked EXECUTE AS user_name, and user_name has the corresponding permissions on the object.

Permissões de alternância de contextoContext Switching Permissions

Para especificar EXECUTE AS em um logon, o chamador precisa ter permissões IMPERSONATE no nome de logon especificado.To specify EXECUTE AS on a login, the caller must have IMPERSONATE permissions on the specified login name. Para especificar EXECUTE AS em um usuário de banco de dados, o chamador precisa ter permissões IMPERSONATE no nome de usuário especificado.To specify EXECUTE AS on a database user, the caller must have IMPERSONATE permissions on the specified user name. Quando nenhum contexto de execução é especificado ou EXECUTE AS CALLER é especificado, as permissões de IMPERSONATE não são solicitadas.When no execution context is specified, or EXECUTE AS CALLER is specified, IMPERSONATE permissions are not required.

ExemplosExamples

A.A. Usando EXECUTE para passar um único parâmetroUsing EXECUTE to pass a single parameter

O procedimento armazenado uspGetEmployeeManagers no banco de dados AdventureWorks2012AdventureWorks2012 espera um parâmetro (@EmployeeID).The uspGetEmployeeManagers stored procedure in the AdventureWorks2012AdventureWorks2012 database expects one parameter (@EmployeeID). Os exemplos a seguir executam o procedimento armazenado uspGetEmployeeManagers com Employee ID 6 como seu valor de parâmetro.The following examples execute the uspGetEmployeeManagers stored procedure with Employee ID 6 as its parameter value.

EXEC dbo.uspGetEmployeeManagers 6;  
GO  

A variável pode ser nomeada explicitamente na execução:The variable can be explicitly named in the execution:

EXEC dbo.uspGetEmployeeManagers @EmployeeID = 6;  
GO  

Se o exemplo a seguir for a primeira instrução de um lote ou em um script osql ou sqlcmd, EXEC não será obrigatório.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.B. Usando vários parâmetrosUsing multiple parameters

O exemplo a seguir executa o procedimento armazenado spGetWhereUsedProductID no banco de dados AdventureWorks2012AdventureWorks2012.The following example executes the spGetWhereUsedProductID stored procedure in the AdventureWorks2012AdventureWorks2012 database. Ele passa dois parâmetros: o primeiro é uma identificação de produto (819) e o segundo @CheckDate, é um valor 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.C. Usando EXECUTE 'tsql_string' com uma variávelUsing EXECUTE 'tsql_string' with a variable

O exemplo seguinte mostra como EXECUTE controla dinamicamente as cadeias de caracteres criadas que contêm variáveis.The following example shows how EXECUTE handles dynamically built strings that contain variables. Esse exemplo cria o cursor tables_cursor para manter uma lista de todas as tabelas definidas pelo usuário no banco de dados AdventureWorks2012AdventureWorks2012 e, depois, usa essa lista para criar novamente todos os índices nas tabelas.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.D. Usando EXECUTE com um procedimento armazenado remotoUsing EXECUTE with a remote stored procedure

O exemplo a seguir executa o procedimento uspGetEmployeeManagers armazenado no servidor remoto SQLSERVER1 e armazena o status de retorno que indica o êxito ou a falha em @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.

Aplica-se a: do SQL Server 2008SQL Server 2008 ao 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.E. Usando EXECUTE com uma variável de procedimento armazenadoUsing EXECUTE with a stored procedure variable

O exemplo seguinte cria uma variável que representa um nome de procedimento armazenado.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.F. Usando EXECUTE com DEFAULTUsing EXECUTE with DEFAULT

O exemplo seguinte cria um procedimento armazenado com valores padrão para o primeiro e terceiro parâmetros.The following example creates a stored procedure with default values for the first and third parameters. Quando o procedimento é executado, esses padrões serão inseridos para o primeiro e terceiro parâmetros quando nenhum valor for informado na chamada ou quando o padrão for especificado.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. Observe os vários modos que a palavra-chave DEFAULT pode ser usada.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  
  

O procedimento armazenado Proc_Test_Defaults pode ser executado em muitas combinações.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.G. Usando EXECUTE com AT linked_server_nameUsing EXECUTE with AT linked_server_name

O exemplo seguinte envia uma cadeia de caracteres de comando a um servidor remoto.The following example passes a command string to a remote server. Ele cria um servidor vinculado SeattleSales que aponta para outra instância de SQL ServerSQL Server e executa uma instrução DDL (CREATE TABLE) nesse servidor vinculado.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.

Aplica-se a: do SQL Server 2008SQL Server 2008 ao 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.H. Usando EXECUTE WITH RECOMPILEUsing EXECUTE WITH RECOMPILE

O exemplo a seguir executa o procedimento armazenado Proc_Test_Defaults e força a compilação, o uso e o descarte de um novo plano de consulta após a execução do módulo.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.I. Usando EXECUTE com uma função definida pelo usuárioUsing EXECUTE with a user-defined function

O exemplo a seguir executa a função escalar definida pelo usuário ufnGetSalesOrderStatusText no banco de dados AdventureWorks2012AdventureWorks2012.The following example executes the ufnGetSalesOrderStatusText scalar user-defined function in the AdventureWorks2012AdventureWorks2012 database. É utilizada a variável @returnstatus para armazenar o valor retornado pela função.It uses the variable @returnstatus to store the value returned by the function. A função espera um parâmetro de entrada, @Status.The function expects one input parameter, @Status. Isso é definido como um tipo de dados 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.J. Usando EXECUTE para consultar um banco de dados Oracle em um servidor vinculadoUsing EXECUTE to query an Oracle database on a linked server

O exemplo a seguir executa várias instruções SELECT no servidor remoto Oracle.The following example executes several SELECT statements at the remote Oracle server. O exemplo começa adicionando o servidor Oracle como um servidor vinculado e criando o logon de servidor vinculado.The example begins by adding the Oracle server as a linked server and creating linked server login.

Aplica-se a: do SQL Server 2008SQL Server 2008 ao 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.K. Usando EXECUTE AS USER para alternar o contexto para outro usuárioUsing EXECUTE AS USER to switch context to another user

O exemplo a seguir executa uma cadeia de caracteres Transact-SQLTransact-SQL que cria uma tabela e especifica a cláusula AS USER para alternar o contexto de execução da instrução do chamador para 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. O Mecanismo de Banco de DadosDatabase Engine verificará as permissões de User1 quando a instrução for executada.The Mecanismo de Banco de DadosDatabase Engine will check the permissions of User1 when the statement is run. User1 deve existir como um usuário no banco de dados e deve ter permissão para criar tabelas no esquema Sales, caso contrário, haverá falha na instrução.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.L. Usando um parâmetro com EXECUTE e AT linked_server_nameUsing a parameter with EXECUTE and AT linked_server_name

O exemplo a seguir envia uma cadeia de caracteres de comando a um servidor remoto usando um ponto de interrogação (?) como espaço reservado de um parâmetro.The following example passes a command string to a remote server by using a question mark (?) placeholder for a parameter. O exemplo cria um servidor vinculado SeattleSales que aponta para outra instância de SQL ServerSQL Server e executa uma instrução SELECT nesse servidor vinculado.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. A instrução SELECT usa o ponto de interrogação como um espaço reservado para o parâmetro ProductID (952), fornecido após a instrução.The SELECT statement uses the question mark as a place holder for the ProductID parameter (952), which is provided after the statement.

Aplica-se a: do SQL Server 2008SQL Server 2008 ao 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.M. Usando EXECUTE para redefinir um único conjunto de resultadosUsing EXECUTE to redefine a single result set

Alguns dos exemplos anteriores executaram EXEC dbo.uspGetEmployeeManagers 6; que retornou 7 colunas.Some of the previous examples executed EXEC dbo.uspGetEmployeeManagers 6; which returned 7 columns. O exemplo a seguir demonstra o uso da sintaxe WITH RESULT SET para alterar os nomes e tipos de dados do conjunto de resultados retornado.The following example demonstrates using the WITH RESULT SET syntax to change the names and data types of the returning result set.

Aplica-se a: do SQL Server 2012 (11.x)SQL Server 2012 (11.x) ao SQL Server 2019SQL Server 2019, Banco de dados SQL do AzureAzure SQL DatabaseApplies to: SQL Server 2012 (11.x)SQL Server 2012 (11.x) through SQL Server 2019SQL Server 2019, Banco de dados SQL do 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.N. Usando EXECUTE para redefinir dois conjuntos de resultadosUsing EXECUTE to redefine a two result sets

Ao executar uma instrução que retorna mais de um conjunto de resultados, defina cada conjunto de resultados esperado.When executing a statement that returns more than one result set, define each expected result set. O exemplo a seguir em AdventureWorks2012AdventureWorks2012 cria um procedimento armazenado que retorna dois conjuntos de resultados.The following example in AdventureWorks2012AdventureWorks2012 creates a procedure that returns two result sets. Em seguida, o procedimento é executado com a cláusula WITH RESULT SETS e com a especificação definições de dois conjuntos de resultados.Then the procedure is executed using the WITH RESULT SETS clause, and specifying two result set definitions.

Aplica-se a: do SQL Server 2012 (11.x)SQL Server 2012 (11.x) ao SQL Server 2019SQL Server 2019, Banco de dados SQL do AzureAzure SQL DatabaseApplies to: SQL Server 2012 (11.x)SQL Server 2012 (11.x) through SQL Server 2019SQL Server 2019, Banco de dados SQL do 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)  
);  
  

Exemplos: Azure Synapse Analytics (SQL DW)Azure Synapse Analytics (SQL DW) e Parallel Data WarehouseParallel Data WarehouseExamples: Azure Synapse Analytics (SQL DW)Azure Synapse Analytics (SQL DW) and Parallel Data WarehouseParallel Data Warehouse

Exemplo O: Execução de procedimento armazenadoExample O: Basic Procedure Execution

Executando um procedimento armazenado:Executing a stored procedure:

EXEC proc1;  

Chamando um procedimento armazenado com um nome determinado em tempo de execução:Calling a stored procedure with name determined at runtime:

EXEC ('EXEC ' + @var);  

Chamando um procedimento armazenado em um procedimento armazenado:Calling a stored procedure from within a stored procedure:

CREATE sp_first AS EXEC sp_second; EXEC sp_third;  

Exemplo P: Como executar cadeias de caracteresExample P: Executing Strings

Executando uma cadeia de caracteres SQL:Executing a SQL string:

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

Executando uma cadeia de caracteres aninhada:Executing a nested string:

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

Executando uma variável de cadeia de caracteres:Executing a string variable:

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

Exemplo Q: Procedimentos com parâmetrosExample Q: Procedures with Parameters

O seguinte exemplo cria um procedimento com parâmetros e demonstra três maneiras de executar o procedimento: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  

Consulte TambémSee Also

@@NESTLEVEL (Transact-SQL) @@NESTLEVEL (Transact-SQL)
DECLARE @local_variable (Transact-SQL) DECLARE @local_variable (Transact-SQL)
Cláusula EXECUTE AS (Transact-SQL) EXECUTE AS Clause (Transact-SQL)
Utilitário osql osql Utility
Entidades (Mecanismo de Banco de Dados) Principals (Database Engine)
REVERT (Transact-SQL) REVERT (Transact-SQL)
sp_addlinkedserver (Transact-SQL) sp_addlinkedserver (Transact-SQL)
Utilitário 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)
Funções escalares definidas pelo usuário para OLTP in-memoryScalar User-Defined Functions for In-Memory OLTP