EXECUTE (Transact-SQL)
Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do AzureAzure Synapse AnalyticsAnalytics Platform System (PDW)Ponto de extremidade de análise de SQL no Microsoft FabricWarehouse no Microsoft FabricBanco de Dados SQL no Microsoft Fabric
Executa uma cadeia de caracteres de comando, uma cadeia de caracteres em um lote Transact-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. A instrução EXEC
ou EXECUTE
pode ser usada para enviar comandos de passagem para servidores vinculados. Além disso, o contexto no qual uma cadeia de caracteres ou comando é executado pode ser definido explicitamente. Os metadados do conjunto de resultados podem ser definidos usando as opções de WITH RESULT SETS
.
Importante
Antes de chamar EXECUTE
com uma cadeia de caracteres, valide a cadeia de caracteres. Nunca execute um comando construído a partir da entrada do usuário que não tenha sido validado.
Convenções de sintaxe de Transact-SQL
Sintaxe
O bloco de código a seguir mostra a sintaxe no SQL Server 2019 (15.x) e versões posteriores. Como alternativa, em vez disso, confira a sintaxe no SQL Server 2017 e versões anteriores.
Sintaxe para o SQL Server 2019 e versões posteriores.
-- 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 ]
[ AT DATA_SOURCE data_source_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
}
O bloco de código a seguir mostra a sintaxe no SQL Server 2017 (14.x) e versões anteriores. Como alternativa, em vez disso, confira a sintaxe no SQL Server 2019.
Sintaxe para SQL Server 2017 e versões anteriores.
-- 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
}
Sintaxe para 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 ] ) }
}
Sintaxe do Banco de Dados SQL do Azure.
-- 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
}
Sintaxe do Azure Synapse Analytics e do 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 ] )
[ ; ]
Sintaxe para o Microsoft Fabric.
-- Execute a stored procedure
[ { EXEC | EXECUTE } ]
procedure_name
[ { value | @variable [ OUT | OUTPUT ] } ] [ ,...n ]
[ WITH <execute_option> [ ,...n ] ] }
[ ; ]
-- Execute a SQL string
{ EXEC | EXECUTE }
( { @string_variable | [ N ] 'tsql_string' } [ +...n ] )
[ ; ]
<execute_option>::=
{
RECOMPILE
| { RESULT SETS UNDEFINED }
| { RESULT SETS NONE }
| { RESULT SETS ( <result_sets_definition> [,...n ] ) }
}
Argumentos
@return_status
Uma variável de inteiro opcional que armazena o status de retorno de um módulo. Essa variável deve ser declarada no lote, no procedimento armazenado ou na função antes de ser usada em uma instrução EXECUTE
.
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.
module_name
O nome totalmente qualificado ou não qualificado do procedimento armazenado ou da função definida pelo usuário com valor escalar a ser chamada. Os nomes de módulos devem obedecer às regras de identificadores. Os nomes de procedimentos armazenados estendidos sempre têm diferenciação entre maiúsculas e minúsculas, independentemente da ordenação do servidor.
Um módulo criado em outro banco de dados poderá ser executado se o usuário que executa o módulo for proprietário do módulo ou tiver a permissão apropriada para executá-lo nesse banco de dados. Um módulo poderá ser executado em outro servidor que executa SQL 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. 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 Server procurará o módulo no banco de dados padrão do usuário.
;number
Um inteiro opcional que é usado para agrupar procedimentos de mesmo nome. Esse parâmetro não é usado para procedimentos armazenados estendidos.
Observação
Esse recurso será removido em uma versão futura do SQL Server. Evite usar esse recurso em desenvolvimentos novos e planeje modificar os aplicativos que atualmente o utilizam.
Para obter mais informações sobre grupos de procedimentos, consulte CREATE PROCEDURE.
@module_name_var
O nome de uma variável definida localmente que representa um nome de módulo.
Isso pode ser uma variável que contém o nome de uma função escalar definida pelo usuário compilada nativamente.
@parameter
O parâmetro para module_name, conforme definido no módulo. Os nomes de parâmetro devem ser precedidos pelo sinal (@
). Quando usado com o valor @parameter_name = formulário, nomes de parâmetro e constantes não precisam ser fornecidos na ordem em que são definidos no módulo. No entanto, se o valor @parameter_name = formulário for usado para qualquer parâmetro, ele deverá ser usado para todos os parâmetros subsequentes.
Por padrão, os parâmetros são anuláveis.
value
O valor do parâmetro a ser passado para o módulo ou o comando de passagem. Se os nomes de parâmetro não forem especificados, os valores de parâmetro deverão ser fornecidos na ordem definida no módulo.
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. A maioria dos provedores OLE DB associa valores para os parâmetros da esquerda para a direita.
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. Se o valor de um parâmetro for uma palavra-chave, a palavra-chave deverá ficar dentro de aspas duplas.
Se você passar uma única palavra que não comece com
Se um padrão estiver definido no módulo, um usuário poderá executar o módulo sem especificar um parâmetro.
O padrão também pode ser NULL
. Em geral, a definição do módulo especifica a ação que deve ser tomada se um valor de parâmetro for NULL
.
@variable
A variável que armazena um parâmetro ou um parâmetro de retorno.
OUTPUT
Especifica que o módulo ou a cadeia de caracteres de comando deve retornar um parâmetro. O parâmetro correspondente no módulo ou na cadeia de caracteres de comando também deve ter sido criado usando a palavra-chave OUTPUT
. Use essa palavra-chave quando você usar variáveis de cursor como parâmetros.
Se valor for definido como OUTPUT
de um módulo executado em um servidor vinculado, quaisquer alterações no @parameter correspondente executadas pelo provedor OLE DB serão copiadas de volta para a variável no final da execução do módulo.
Se OUTPUT
parâmetros estiverem sendo usados e a intenção for usar os valores retornados em outras instruções dentro do lote ou módulo de chamada, o valor do parâmetro deverá ser passado como uma variável, como @parameter = @variable. Você não pode executar um módulo especificando OUTPUT
para um parâmetro que não é definido como um parâmetro OUTPUT
no módulo. As constantes não podem ser passadas para o módulo usando OUTPUT
; o parâmetro de retorno requer um nome de variável. O tipo de dados da variável deve ser declarado e ter um valor atribuído antes da execução do procedimento.
Quando EXECUTE
é usado em um procedimento armazenado remoto ou para executar um comando de passagem em um servidor vinculado, OUTPUT
parâmetros não podem ser nenhum dos tipos de dados LOB (objeto grande).
Os parâmetros de retorno podem ser de qualquer tipo de dados, exceto os tipos de dados LOB.
DEFAULT
Fornece o valor padrão do parâmetro como definido no módulo. Quando o módulo espera um valor para um parâmetro que não tem um padrão definido e um parâmetro está ausente ou a palavra-chave DEFAULT
é especificada, ocorre um erro.
@string_variable
O nome de uma variável local. @string_variable pode ser qualquer char, varchar, ncharou tipo de dados nvarchar. Incluem os tipos de dados (max) .
[N]'tsql_string'
Uma cadeia de caracteres constante.
tsql_string pode ser qualquer tipo de dados nvarchar ou varchar. Se o N
estiver incluído, a cadeia de caracteres será interpretada como nvarchar tipo de dados.
AS context_specification
Especifica o contexto no qual a instrução é executada.
LOGIN
Especifica que o contexto para ser representado é um logon. O escopo de personificação é o servidor.
USER
Especifica que o contexto a ser representado é um usuário no banco de dados atual. O escopo de representação é restrito ao banco de dados atual. Uma mudança de contexto para um usuário de banco de dados não herda as permissões no nível do servidor desse usuário.
Importante
Embora a opção de contexto para o usuário do banco de dados esteja ativa, qualquer tentativa de acessar recursos fora do banco de dados faz com que a instrução falhe. Isso inclui instruções USE <database>
, consultas distribuídas e consultas que fazem referência a outro banco de dados usando identificadores de três ou quatro partes.
'name'
Um nome de logon ou usuário válido. O nome argumento deve ser um membro da função de servidor sysadmin fixa ou existir como uma entidade de segurança em sys.database_principals ou sys.server_principals, respectivamente.
Esse argumento não pode ser uma conta interna, como NT AUTHORITY\LocalService
, NT AUTHORITY\NetworkService
ou NT AUTHORITY\LocalSystem
.
Para obter mais informações, consulte Especificando um nome de usuário ou de logon posteriormente neste artigo.
[N]'command_string'
Uma cadeia de caracteres constante que contém o comando a ser passado para o servidor vinculado. Se o N
estiver incluído, a cadeia de caracteres será interpretada como nvarchar tipo de dados.
[?]
Indica parâmetros para os quais os valores são fornecidos no <arg-list>
de comandos de passagem que são usados em uma instrução EXECUTE ('...', <arg-list>) AT <linkedsrv>
.
AT linked_server_name
Especifica que command_string é executada em linked_server_name e os resultados, se houver, são retornados ao cliente. linked_server_name deve referenciar uma definição de servidor vinculado existente no servidor local. Os servidores vinculados são definidos por meio de sp_addlinkedserver.
WITH <execute_option>
Opções de execução possíveis. As opções de
RESULT SETS
não podem ser especificadas em uma instruçãoINSERT...EXECUTE
.
AT DATA_SOURCE data_source_name
aplica-se a: SQL Server 2019 (15.x) e versões posteriores.
Especifica que a command_string é executada no data_source_name e os resultados, se houver, são retornados ao cliente.
data_source_name deve se referir a uma definição de EXTERNAL DATA SOURCE
existente no banco de dados. Somente as fontes de dados que apontam para o SQL Server são compatíveis. Além disso, há suporte para fontes de dados do Cluster de Big Data do SQL Server que apontam para pool de computação, pool de dados ou pool de armazenamento. As fontes de dados são definidas usando CREATE EXTERNAL DATA SOURCE.
WITH <execute_option>
Opções de execução possíveis. As opções de
RESULT SETS
não podem ser especificadas em uma instruçãoINSERT...EXECUTE
.Termo Definição RECOMPILE
Força a compilação, a utilização e o descarte de um novo plano após a execução do módulo. Se houver um plano de consulta existente para o módulo, esse plano permanecerá no cache.
Use essa opção se o parâmetro que você está fornecendo for atípico ou se os dados tiverem sido significativamente alterados. Essa opção não é usada para procedimentos armazenados estendidos. Recomendamos que você use essa opção com moderação porque ela é cara.
Observação: Você não pode usarWITH RECOMPILE
ao chamar um procedimento armazenado que usaOPENDATASOURCE
sintaxe. A opçãoWITH RECOMPILE
é ignorada quando um nome de objeto de quatro partes é especificado.
Observação: não há suporte paraRECOMPILE
com funções escalares e compiladas nativamente. Se precisar recompilar, use sp_recompile.RESULT SETS UNDEFINED
Essa opção não fornece nenhuma garantia de quais resultados, se houver, são retornados e nenhuma definição é fornecida. A instrução é executada sem erro se algum resultado for retornado ou se nenhum resultado for retornado. RESULT SETS UNDEFINED
será o comportamento padrão se um result_sets_option não for fornecido.
Para funções escalares definidas pelo usuário interpretadas e funções escalares definidas pelo usuário compiladas nativamente, essa opção não está operacional porque as funções nunca retornam um conjunto de resultados.
aplica-se a: SQL Server 2012 (11.x) e versões posteriores e Banco de Dados SQL do Azure.RESULT SETS NONE
Garante que a instrução EXECUTE
não retorne nenhum resultado. Se algum resultado for retornado, o lote será anulado.
Para funções escalares definidas pelo usuário interpretadas e funções escalares definidas pelo usuário compiladas nativamente, essa opção não está operacional porque as funções nunca retornam um conjunto de resultados.
aplica-se a: SQL Server 2012 (11.x) e versões posteriores e Banco de Dados SQL do Azure.<result_sets_definition>
Fornece uma garantia de que o resultado volta conforme especificado no result_sets_definition
. Para instruções que retornam vários conjuntos de resultados, forneça várias seções de result_sets_definition. Coloque cada result_sets_definition entre parênteses, separada por vírgulas. Para obter mais informações, consulte<result_sets_definition>
mais adiante neste artigo.
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.
aplica-se a: SQL Server 2012 (11.x) e versões posteriores e Banco de Dados SQL do Azure.<result_sets_definition>
descreve os conjuntos de resultados retornados pelas instruções executadas. As cláusulas doresult_sets_definition
têm o seguinte significado:Termo Definição { column_name data_type
[ COLLATE collation_name ]
[NULL | NOT NULL] }Consulte a tabela a seguir. db_name O nome do banco de dados que contém a tabela, a exibição ou a função com valor de tabela. schema_name O nome do esquema que possui a tabela, exibição ou função com valor de tabela. table_name | view_name | table_valued_function_name Especifica que as colunas retornadas são aquelas especificadas na tabela, exibição ou função com valor de tabela nomeada. Não há suporte para variáveis de tabela, tabelas temporárias e sinônimos na sintaxe do objeto AS. AS TYPE [ schema_name. ]table_type_name Especifica que as colunas retornadas são aquelas especificadas no tipo de tabela. AS FOR XML Especifica que os resultados XML da instrução ou do procedimento armazenado chamados pela instrução EXECUTE
são convertidos no formato como se fossem produzidos por uma instruçãoSELECT ... FOR XML ...
. Toda a formatação das diretivas de tipo na instrução original é removida e os resultados retornados são como se nenhuma diretiva de tipo fosse especificada. O AS FOR XML não converte resultados tabulares não XML da instrução executada ou do procedimento armazenado em XML.Termo Definição column_name Os nomes de cada coluna. Se o número de colunas for diferente do conjunto de resultados, ocorrerá um erro e o lote será anulado. Se o nome de uma coluna for diferente do conjunto de resultados, o nome de coluna retornado será definido como o nome definido. data_type Os tipos de dados de cada coluna. Se os tipos de dados forem diferentes, será executada uma conversão implícita para o tipo de dados definido. Se a conversão falhar, o lote será anulado COLLATE collation_name A ordenação de cada coluna. Se houver uma incompatibilidade de ordenação, uma ordenação implícita será tentada. Se isso falhar, o lote será anulado. NULL | NOT NULL A nulidade de cada coluna. Se a nulidade definida for NOT NULL
e os dados retornados contiverem nulos, ocorrerá um erro e o lote será anulado. Se não for especificado, o valor padrão estará em conformidade com a configuração das opçõesANSI_NULL_DFLT_ON
eANSI_NULL_DFLT_OFF
.O conjunto de resultados real retornado durante a execução pode ser diferente 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 da coluna, nulidade e tipo de dados. Se o número de conjuntos de resultados for diferente, ocorrerá um erro e o lote será anulado.
Comentários
Os parâmetros podem ser fornecidos usando valor ou usando @parameter_name = valor. Um parâmetro não faz parte de uma transação; portanto, se um parâmetro for alterado em uma transação que será revertida posteriormente, o valor do parâmetro não será revertido para seu valor anterior. O valor retornado ao chamador será sempre o valor no momento do retorno do módulo.
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. O nível de aninhamento incrementa quando o módulo chamado ou referência de código gerenciado inicia a execução e diminui quando o módulo chamado ou referência de código gerenciado é concluído. Exceder o máximo de 32 níveis de aninhamento faz com que toda a cadeia de chamada falhe. O nível de aninhamento atual é armazenado na função do sistema @@NESTLEVEL
.
Como procedimentos armazenados remotos e procedimentos armazenados estendidos não estão dentro do 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 para eles não podem ser revertidos. Para obter mais informações, consulte Procedimentos armazenados do sistema e BEGIN DISTRIBUTED TRANSACTION.
Quando você usa variáveis de cursor, se você executar um procedimento que passa em uma variável de cursor com um cursor alocado para ele, ocorrerá um erro.
Você não precisa especificar a palavra-chave EXECUTE
ao executar módulos se a instrução for a primeira em um lote.
Para obter mais informações específicas dos procedimentos armazenados clr, consulte clr stored procedures.
Usar EXECUTE com procedimentos armazenados
Você não precisa especificar a palavra-chave EXECUTE
ao executar procedimentos armazenados quando a instrução for a primeira em um lote.
Os procedimentos armazenados do sistema do SQL Server começam com os caracteres sp_
. Eles são armazenados fisicamente no banco de dados de recurso , mas aparecem logicamente no esquema sys de cada sistema e banco de dados definido pelo usuário. 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.
Os procedimentos armazenados estendidos do sistema do SQL Server começam com os caracteres xp_
e eles estão contidos no esquema dbo do banco de dados master
. Quando você executa um procedimento armazenado estendido do sistema, em um lote ou dentro de um módulo, como um procedimento ou função armazenado definido pelo usuário, recomendamos que você qualifique o nome do procedimento armazenado com 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. Não recomendamos que você nomeie um procedimento armazenado definido pelo usuário com o mesmo nome de um procedimento armazenado do sistema. Para obter mais informações sobre como executar procedimentos armazenados, consulte Executar um procedimento armazenado.
Usar EXECUTE com uma cadeia de caracteres
No SQL 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.
As alterações no contexto do banco de dados duram apenas até o final da instrução EXECUTE
. Por exemplo, depois que o EXECUTE
nesta instrução a seguir for executado, o contexto do banco de dados será master
.
USE master;
EXECUTE ('USE AdventureWorks2022; SELECT BusinessEntityID, JobTitle FROM HumanResources.Employee;');
Comutação de contexto
Você pode usar a cláusula AS { LOGIN | USER } = '<name>'
para alternar o contexto de execução de uma instrução dinâmica. 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.
Especificar um usuário ou nome de logon
O usuário ou o nome de logon especificado em AS { LOGIN | USER } = '<name>'
deve existir como uma entidade de segurança em sys.database_principals
ou sys.server_principals
respectivamente, ou a instrução falhará. Além disso, IMPERSONATE
permissões devem ser concedidas na entidade de segurança. A menos que o chamador seja o proprietário do banco de dados ou seja membro do sysadmin função de servidor fixa, a entidade de segurança deve existir mesmo quando o usuário estiver acessando o banco de dados ou a instância do SQL Server por meio de uma associação de grupo do Windows. Por exemplo, considere as seguintes condições:
CompanyDomain\SQLUsers
grupo tem acesso ao banco de dadosSales
.CompanyDomain\SqlUser1
é membro doSQLUsers
e, portanto, tem acesso implícito ao banco de dadosSales
.
Embora CompanyDomain\SqlUser1
tenha acesso ao banco de dados por meio da associação no grupo SQLUsers
, a instrução EXECUTE @string_variable AS USER = 'CompanyDomain\SqlUser1'
falha porque CompanyDomain\SqlUser1
não existe como uma entidade de segurança no banco de dados.
Práticas recomendadas
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. Por exemplo, não especifique um nome de logon, que tenha permissões no nível do servidor, se apenas as permissões no nível do banco de dados forem necessárias. Ou não especifique uma conta de proprietário do banco de dados, a menos que essas permissões sejam necessárias.
Permissões
As permissões não são necessárias para executar a instrução EXECUTE
. No entanto, as permissões são necessárias nos protegíveis referenciados dentro da cadeia de caracteres EXECUTE
. Por exemplo, se a cadeia de caracteres contiver uma instrução INSERT
, o chamador da instrução EXECUTE
deverá ter INSERT
permissão na tabela de destino. As permissões são verificadas no momento em que EXECUTE
instrução é encontrada, mesmo que a instrução EXECUTE
seja incluída em um módulo.
EXECUTE
permissões para um módulo padrão para o proprietário do módulo, que pode transferi-las para outros usuários. 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. No entanto, se o mesmo usuário possui o módulo de chamada e o módulo que está sendo chamado, EXECUTE
verificação de permissão não é executada para o segundo módulo.
Se o módulo acessar outros objetos de banco de dados, a execução terá êxito quando você tiver EXECUTE
permissão no módulo e uma das seguintes condições for verdadeira:
O módulo é marcado como
EXECUTE AS USER
ouEXECUTE AS SELF
e o proprietário do módulo tem as permissões correspondentes no objeto referenciado. Para obter mais informações sobre representação em um módulo, consulte cláusula EXECUTE AS.O módulo é marcado como
EXECUTE AS CALLER
e você tem as permissões correspondentes no objeto.O módulo é marcado como
EXECUTE AS <user_name>
e<user_name>
tem as permissões correspondentes no objeto.
Permissões de comutação de contexto
Para especificar EXECUTE AS
em um logon, o chamador deve ter permissões de IMPERSONATE
no nome de logon especificado. Para especificar EXECUTE AS
em um usuário de banco de dados, o chamador deve ter permissões IMPERSONATE
no nome de usuário especificado. Quando nenhum contexto de execução é especificado ou EXECUTE AS CALLER
é especificado, as permissões de IMPERSONATE
não são necessárias.
Exemplos: SQL Server
Os exemplos de código Transact-SQL neste artigo usam o banco de dados de exemplo AdventureWorks2022
ou AdventureWorksDW2022
, que você pode baixar na home page Microsoft SQL Server Samples and Community Projects.
a. Usar EXECUTE para passar um único parâmetro
O procedimento armazenado uspGetEmployeeManagers
no banco de dados AdventureWorks2022 espera um parâmetro (@EmployeeID
). Os exemplos a seguir executam o procedimento armazenado uspGetEmployeeManagers
com Employee ID 6
como seu valor de parâmetro.
EXECUTE dbo.uspGetEmployeeManagers 6;
GO
A variável pode ser nomeada explicitamente na execução:
EXECUTE dbo.uspGetEmployeeManagers @EmployeeID = 6;
GO
Se a instrução a seguir for a primeira instrução em um lote ou um script de sqlcmd, EXECUTE
não será necessário.
dbo.uspGetEmployeeManagers 6;
GO
--Or
dbo.uspGetEmployeeManagers @EmployeeID = 6;
GO
B. Usar vários parâmetros
O exemplo a seguir executa o procedimento armazenado spGetWhereUsedProductID
no banco de dados AdventureWorks2022. Ele passa dois parâmetros: o primeiro é uma identificação de produto (819
) e o segundo @CheckDate,
é um valor datetime
.
DECLARE @CheckDate AS DATETIME;
SET @CheckDate = GETDATE();
EXECUTE dbo.uspGetWhereUsedProductID 819, @CheckDate;
GO
C. Usar EXECUTE 'tsql_string' com uma variável
O exemplo seguinte mostra como EXECUTE
controla dinamicamente as cadeias de caracteres criadas que contêm variáveis. Esse exemplo cria o cursor tables_cursor
para manter uma lista de todas as tabelas definidas pelo usuário no banco de dados AdventureWorks2022
e, depois, usa essa lista para criar novamente todos os índices nas tabelas.
DECLARE tables_cursor CURSOR
FOR SELECT s.name, t.name FROM sys.objects AS t
INNER JOIN sys.schemas AS s ON s.schema_id = t.schema_id
WHERE t.type = 'U';
OPEN tables_cursor;
DECLARE @schemaname AS sysname;
DECLARE @tablename AS 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;
D. Usar EXECUTE com um procedimento armazenado remoto
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
.
DECLARE @retstat AS INT;
EXECUTE
@retstat = SQLSERVER1.AdventureWorks2022.dbo.uspGetEmployeeManagers
@BusinessEntityID = 6;
E. Usar EXECUTE com uma variável de procedimento armazenado
O exemplo seguinte cria uma variável que representa um nome de procedimento armazenado.
DECLARE @proc_name AS VARCHAR (30);
SET @proc_name = 'sys.sp_who';
EXECUTE @proc_name;
F. Usar EXECUTE com DEFAULT
O exemplo seguinte cria um procedimento armazenado com valores padrão para o primeiro e terceiro parâmetros. 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. Observe os vários modos que a palavra-chave DEFAULT
pode ser usada.
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.
-- 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. Usar EXECUTE com o AT linked_server_name
O exemplo seguinte envia uma cadeia de caracteres de comando a um servidor remoto. Ele cria um servidor vinculado SeattleSales
que aponta para outra instância de SQL Server e executa uma instrução DDL (CREATE TABLE
) nesse servidor vinculado.
EXECUTE sp_addlinkedserver 'SeattleSales', 'SQL Server';
GO
EXECUTE ('CREATE TABLE AdventureWorks2022.dbo.SalesTbl
(SalesID INT, SalesName VARCHAR(10)); ') AT SeattleSales;
GO
H. Usar 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.
EXECUTE dbo.Proc_Test_Defaults @p2 = 'A' WITH RECOMPILE;
GO
I. Usar EXECUTE com uma função definida pelo usuário
O exemplo a seguir executa a função escalar definida pelo usuário ufnGetSalesOrderStatusText
no banco de dados AdventureWorks2022. É utilizada a variável @returnstatus
para armazenar o valor retornado pela função. A função espera um parâmetro de entrada, @Status
. Isso é definido como um tipo de dados tinyint.
DECLARE @returnstatus AS NVARCHAR (15);
SET @returnstatus = NULL;
EXECUTE
@returnstatus = dbo.ufnGetSalesOrderStatusText
@Status = 2;
PRINT @returnstatus;
GO
J. Usar EXECUTE para consultar um banco de dados Oracle em um servidor vinculado
O exemplo a seguir executa várias instruções SELECT
no servidor remoto Oracle. O exemplo começa adicionando o servidor Oracle como um servidor vinculado e criando o logon de servidor vinculado.
-- Setup the linked server.
EXECUTE sp_addlinkedserver
@server = 'ORACLE',
@srvproduct = 'Oracle',
@provider = 'OraOLEDB.Oracle',
@datasrc = 'ORACLE10';
EXECUTE sp_addlinkedsrvlogin
@rmtsrvname = 'ORACLE',
@useself = 'false',
@locallogin = NULL,
@rmtuser = 'scott',
@rmtpassword = 'tiger';
EXECUTE sp_serveroption 'ORACLE', 'rpc out', true;
GO
-- Execute several statements on the linked Oracle server.
EXECUTE ('SELECT * FROM scott.emp') AT ORACLE;
GO
EXECUTE ('SELECT * FROM scott.emp WHERE MGR = ?', 7902) AT ORACLE;
GO
DECLARE @v AS INT;
SET @v = 7902;
EXECUTE ('SELECT * FROM scott.emp WHERE MGR = ?', @v) AT ORACLE;
GO
K. Usar EXECUTE AS USER para alternar o contexto para outro usuário
O exemplo a seguir executa uma cadeia de caracteres Transact-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
. O Mecanismo de Banco de Dados verifica as permissões de User1
quando a instrução é executada.
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.
EXECUTE ('CREATE TABLE Sales.SalesTable (SalesID INT, SalesName VARCHAR(10));')
AS USER = 'User1';
GO
L. Usar um parâmetro com EXECUTE e 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. O exemplo cria um servidor vinculado SeattleSales
que aponta para outra instância de SQL Server e executa uma instrução SELECT
nesse servidor vinculado. 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.
-- Setup the linked server.
EXECUTE sp_addlinkedserver 'SeattleSales', 'SQL Server';
GO
-- Execute the SELECT statement.
EXECUTE ('SELECT ProductID, Name
FROM AdventureWorks2022.Production.Product
WHERE ProductID = ? ', 952) AT SeattleSales;
GO
M. Usar EXECUTE para redefinir um único conjunto de resultados
aplica-se a: SQL Server 2012 (11.x) e versões posteriores e Banco de Dados SQL do Azure.
Alguns dos exemplos anteriores executados EXECUTE dbo.uspGetEmployeeManagers 6;
que retornaram sete colunas. 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.
EXECUTE 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. Usar EXECUTE para redefinir dois conjuntos de resultados
aplica-se a: SQL Server 2012 (11.x) e versões posteriores e Banco de Dados SQL do Azure.
Ao executar uma instrução que retorna mais de um conjunto de resultados, defina cada conjunto de resultados esperado. O exemplo a seguir em AdventureWorks2022
cria um procedimento armazenado que retorna dois conjuntos de resultados. Em seguida, o procedimento é executado usando a cláusula WITH RESULT SETS
e especificando duas definições de conjunto de resultados.
--Create the procedure
CREATE PROCEDURE 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
INNER JOIN Sales.SalesOrderDetail AS S
ON P.ProductID = S.ProductID
WHERE Name LIKE @ProdName
GROUP BY Name;
GO
-- Execute the procedure
EXECUTE Production.ProductList '%tire%' WITH RESULT SETS
(
-- first result set definition starts here
(ProductID INT,
[Name] NAME,
ListPrice MONEY)
-- comma separates result set definitions
,
-- second result set definition starts here
([Name] NAME,
NumberOfOrders INT)
);
O. Usar EXECUTE com o AT DATA_SOURCE data_source_name para consultar um SQL Server remoto
aplica-se a: SQL Server 2019 (15.x) e versões posteriores.
O exemplo a seguir passa uma cadeia de caracteres de comando para uma fonte de dados externa apontando para uma Instância do SQL Server.
EXECUTE ( 'SELECT @@SERVERNAME' ) AT DATA_SOURCE my_sql_server;
GO
P. Usar EXECUTE com AT DATA_SOURCE data_source_name para consultar o pool de computação no Cluster de Big Data do SQL Server
aplica-se a: SQL Server 2019 (15.x).
O exemplo a seguir passa uma cadeia de caracteres de comando para uma fonte de dados externa apontando para um pool de computação no Cluster de Big Data do SQL Server. O exemplo cria uma fonte de dados SqlComputePool
em um pool de computação no Cluster de Big Data do SQL Server e executa uma instrução SELECT
na fonte de dados.
CREATE EXTERNAL DATA SOURCE SqlComputePool
WITH (LOCATION = 'sqlcomputepool://controller-svc/default');
EXECUTE ('SELECT @@SERVERNAME') AT DATA_SOURCE SqlComputePool;
GO
Q. Usar EXECUTE com o AT DATA_SOURCE data_source_name para consultar o pool de dados no Cluster de Big Data do SQL Server
aplica-se a: SQL Server 2019 (15.x).
O exemplo a seguir passa uma cadeia de caracteres de comando para uma fonte de dados externa apontando para o pool de computação no BDC (Cluster de Big Data) do SQL Server. O exemplo cria uma fonte de dados SqlDataPool
em um pool de dados no BDC e executa uma instrução SELECT
na fonte de dados.
CREATE EXTERNAL DATA SOURCE SqlDataPool
WITH (LOCATION = 'sqldatapool://controller-svc/default');
EXECUTE ('SELECT @@SERVERNAME') AT DATA_SOURCE SqlDataPool;
GO
R. Usar EXECUTE com o AT DATA_SOURCE data_source_name para consultar o pool de armazenamento no Cluster de Big Data do SQL Server
aplica-se a: SQL Server 2019 (15.x).
O exemplo a seguir passa uma cadeia de caracteres de comando para uma fonte de dados externa apontando para um pool de computação no Cluster de Big Data do SQL Server. O exemplo cria uma fonte de dados SqlStoragePool
em um pool de dados no Cluster de Big Data do SQL Server e executa uma instrução SELECT
na fonte de dados.
CREATE EXTERNAL DATA SOURCE SqlStoragePool
WITH (LOCATION = 'sqlhdfs://controller-svc/default');
EXECUTE ('SELECT @@SERVERNAME') AT DATA_SOURCE SqlStoragePool;
GO
Exemplos: Azure Synapse Analytics
Os exemplos de código Transact-SQL neste artigo usam o banco de dados de exemplo AdventureWorks2022
ou AdventureWorksDW2022
, que você pode baixar na home page Microsoft SQL Server Samples and Community Projects.
R: Execução de procedimento básico
Execute um procedimento armazenado:
EXECUTE proc1;
Chame um procedimento armazenado com o nome determinado no runtime:
EXECUTE ('EXECUTE ' + @var);
Chame um procedimento armazenado de dentro de um procedimento armazenado:
CREATE sp_first AS EXECUTE sp_second; EXECUTE sp_third;
B: Executar cadeias de caracteres
Execute uma cadeia de caracteres SQL:
EXECUTE ('SELECT * FROM sys.types');
Execute uma cadeia de caracteres aninhada:
EXECUTE ('EXECUTE (''SELECT * FROM sys.types'')');
Execute uma variável de cadeia de caracteres:
DECLARE @stringVar AS NVARCHAR (100);
SET @stringVar = N'SELECT name FROM' + ' sys.sql_logins';
EXECUTE (@stringVar);
C: Procedimentos com parâmetros
O exemplo a seguir cria um procedimento com parâmetros e demonstra três maneiras de executar o procedimento:
CREATE PROCEDURE ProcWithParameters (
@name NVARCHAR (50),
@color NVARCHAR (15)
)
AS
SELECT ProductKey,
EnglishProductName,
Color
FROM [dbo].[DimProduct]
WHERE EnglishProductName LIKE @namef
AND Color = @color;
GO
Execute usando parâmetros posicionais:
EXECUTE ProcWithParameters N'%arm%', N'Black';
Execute usando parâmetros nomeados na ordem:
EXECUTE ProcWithParameters
@name = N'%arm%',
@color = N'Black';
Execute usando parâmetros nomeados fora de ordem:
EXECUTE ProcWithParameters
@color = N'Black',
@name = N'%arm%';
GO
Conteúdo relacionado
- @@NESTLEVEL (Transact-SQL)
- DECLARE @local_variable (Transact-SQL)
- Cláusula EXECUTE AS (Transact-SQL)
- Utilitário osql
- Entidades (Mecanismo de Banco de Dados)
- REVERT (Transact-SQL)
- sp_addlinkedserver (Transact-SQL)
- Utilitário sqlcmd
- SUSER_NAME (Transact-SQL)
- sys.database_principals (Transact-SQL)
- sys.server_principals (Transact-SQL)
- USER_NAME (Transact-SQL)
- OPENDATASOURCE (Transact-SQL)
- Funções escalares definidas pelo usuário para OLTP in-memory