EXECUTE (Transact-SQL)
Se aplica a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Punto de conexión de análisis SQL en Microsoft FabricWarehouse en Microsoft FabricBase de datos SQL de Microsoft Fabric
Ejecuta una cadena de comandos o una cadena de caracteres dentro de un lote de Transact-SQL o uno de los siguientes módulos: procedimiento almacenado del sistema, procedimiento almacenado definido por el usuario, procedimiento almacenado CLR, función escalar definida por el usuario o procedimiento almacenado extendido. La instrucción EXEC
o EXECUTE
se puede usar para enviar comandos de paso a través a servidores vinculados. Adicionalmente, el contexto en el que se ejecuta una cadena o un comando se puede establecer de forma explícita. Los metadatos del conjunto de resultados se pueden definir mediante las opciones de WITH RESULT SETS
.
Importante
Antes de llamar a EXECUTE
con una cadena de caracteres, valide la cadena de caracteres. Nunca ejecute un comando construido a partir de la entrada del usuario que no se haya validado.
Convenciones de sintaxis de Transact-SQL
Sintaxis
El siguiente bloque de código muestra la sintaxis en SQL Server 2019 (15.x) y versiones posteriores. Como alternativa, vea Sintaxis de SQL Server 2017 y anterior en su lugar.
Sintaxis para SQL Server 2019 y versiones 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
}
El siguiente bloque de código muestra la sintaxis en SQL Server 2017 (14.x) y versiones anteriores. Como alternativa, vea Sintaxis de SQL Server 2019 en su lugar.
Sintaxis para SQL Server 2017 y versiones 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
}
Sintaxis 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 ] ) }
}
Sintaxis de 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
}
Sintaxis para Azure Synapse Analytics y Almacenamiento de datos paralelos.
-- 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 ] )
[ ; ]
Sintaxis de 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
Variable de entero opcional que almacena el estado devuelto de un módulo. Esta variable debe declararse en el lote, el procedimiento almacenado o la función antes de que se use en una instrucción EXECUTE
.
Cuando se usa para invocar una función definida por el usuario con valores escalares, la variable @return_status puede ser de cualquier tipo de datos escalar.
module_name
Nombre completo o no calificado del procedimiento almacenado o función definida por el usuario con valores escalares que se va a llamar. Los nombres de módulo deben cumplir las reglas de los identificadores. Los nombres de los procedimientos almacenados extendidos distinguen siempre entre mayúsculas y minúsculas, sin tener en cuenta la intercalación del servidor.
Un módulo que se creó en otra base de datos se puede ejecutar si el usuario que ejecuta el módulo posee el módulo o tiene el permiso adecuado para ejecutarlo en esa base de datos. Un módulo puede ejecutarse en otro servidor que esté ejecutando SQL Server si el usuario que ejecuta el módulo tiene los permisos adecuados para utilizar ese servidor (acceso remoto) y para ejecutar el módulo en dicha base de datos. Si se especifica un nombre de servidor, pero no se especifica nombre de base de datos, Motor de base de datos de SQL Server busca el módulo en la base de datos predeterminada del usuario.
;number
Entero opcional que se usa para agrupar procedimientos del mismo nombre. Este parámetro no se usa para procedimientos almacenados extendidos.
Nota:
Esta característica se quitará en una versión futura de SQL Server. Evite utilizar esta característica en nuevos trabajos de desarrollo y tenga previsto modificar las aplicaciones que actualmente la utilizan.
Para obtener más información sobre los grupos de procedimientos, vea CREATE PROCEDURE.
@module_name_var
Nombre de una variable definida localmente que representa un nombre de módulo.
Puede ser una variable que contiene el nombre de una función escalar definida por el usuario y compilada de forma nativa.
@parameter
Parámetro para module_name, tal como se define en el módulo. Los nombres de parámetro deben ir precedidos por el signo at (@
). Cuando se usa con el valor de @parameter_name = formulario, los nombres de parámetro y las constantes no tienen que proporcionarse en el orden en que se definen en el módulo. Sin embargo, si el valor de @parameter_name = formulario se usa para cualquier parámetro, se debe usar para todos los parámetros posteriores.
De manera predeterminada, los parámetros admiten valores NULL.
value
Valor del parámetro que se va a pasar al módulo o al comando de paso a través. Si no se especifican nombres de parámetro, los valores de parámetro deben proporcionarse en el orden definido en el módulo.
Cuando se ejecutan comandos de paso a través contra servidores vinculados, el orden de los valores de los parámetros depende del proveedor OLE DB del servidor vinculado. La mayoría de proveedores OLE DB enlazan valores a parámetros de izquierda a derecha.
Si el valor de un parámetro es un nombre de objeto o cadena de caracteres, o está calificado mediante un nombre de base de datos o nombre de esquema, el nombre completo debe escribirse entre comillas simples. Si el valor de un parámetro es una palabra clave, ésta debe escribirse entre comillas dobles.
Si pasa una sola palabra que no comienza por @
, que no está entre comillas (por ejemplo, si olvida @
en un nombre de parámetro), la palabra se trata como una cadena nvarchar, a pesar de las comillas que faltan.
Si se define un valor predeterminado en el módulo, un usuario podrá ejecutar el módulo sin especificar ningún parámetro.
El valor predeterminado también puede ser NULL
. Por lo general, la definición del módulo especifica la acción que se debe realizar si un valor de parámetro es NULL
.
@variable
Variable que almacena un parámetro o un parámetro devuelto.
OUTPUT
Especifica que el módulo o la cadena de comandos devuelve un parámetro. El parámetro coincidente de la cadena de comandos o del módulo también debe haberse creado mediante la palabra clave OUTPUT
. Utilice esta palabra clave cuando use variables de cursor como parámetros.
Si valor se define como OUTPUT
de un módulo ejecutado en un servidor vinculado, los cambios realizados en el @parameter correspondiente realizado por el proveedor OLE DB se copian de nuevo en la variable al final de la ejecución del módulo.
Si se usan OUTPUT
parámetros y la intención es usar los valores devueltos en otras instrucciones dentro del lote o módulo de llamada, el valor del parámetro debe pasarse como una variable, como @parameter = @variable. No se puede ejecutar un módulo especificando OUTPUT
para un parámetro que no está definido como un parámetro OUTPUT
en el módulo. Las constantes no se pueden pasar al módulo mediante OUTPUT
; El parámetro return requiere un nombre de variable. El tipo de datos de la variable debe estar declarado y se le debe haber asignado un valor para poder ejecutar el procedimiento.
Cuando se usa EXECUTE
en un procedimiento almacenado remoto o para ejecutar un comando de paso a través en un servidor vinculado, OUTPUT
parámetros no pueden ser ninguno de los tipos de datos de objetos grandes (LOB).
Los parámetros devueltos pueden ser de cualquier tipo de datos, excepto del tipo de datos LOB.
DEFAULT
Proporciona el valor predeterminado del parámetro tal como se define en el módulo. Cuando el módulo espera un valor para un parámetro que no tiene un valor predeterminado definido y falta un parámetro o se especifica la palabra clave DEFAULT
, se produce un error.
@string_variable
Nombre de una variable local. @string_variable puede ser cualquier char, varchar, ncharo tipo de datos nvarchar. Esto engloba los tipos de datos (max) .
[N]'tsql_string'
Cadena constante.
tsql_string puede ser cualquier tipo de datos nvarchar o varchar. Si se incluye el N
, la cadena se interpreta como tipo de datos nvarchar.
AS context_specification
Especifica el contexto en el que se ejecuta la instrucción.
LOGIN
Especifica que el contexto que se va a suplantar es un inicio de sesión. El ámbito de la suplantación es el servidor.
USER
Especifica que el contexto de ejecución que se va a suplantar es un usuario de la base de datos actual. El ámbito de la suplantación se restringe a la base de datos actual. Un cambio de contexto a un usuario de base de datos no hereda los permisos de nivel de servidor de ese usuario.
Importante
Mientras el cambio de contexto al usuario de la base de datos está activo, cualquier intento de acceder a los recursos fuera de la base de datos hace que se produzca un error en la instrucción. Esto incluye instrucciones USE <database>
, consultas distribuidas y consultas que hacen referencia a otra base de datos mediante identificadores de tres o cuatro partes.
'name'
Un nombre de usuario o de inicio de sesión válido. El nombre argumento debe ser miembro del rol fijo de servidor sysadmin o existir como entidad de seguridad en sys.database_principals o sys.server_principals, respectivamente.
Este argumento no puede ser una cuenta integrada, como NT AUTHORITY\LocalService
, NT AUTHORITY\NetworkService
o NT AUTHORITY\LocalSystem
.
Para obtener más información, vea Especificar un nombre de usuario o de inicio de sesión más adelante en este artículo.
[N]'command_string'
Cadena constante que contiene el comando que se va a pasar al servidor vinculado. Si se incluye el N
, la cadena se interpreta como tipo de datos nvarchar.
[?]
Indica los parámetros para los que se proporcionan valores en el <arg-list>
de comandos de paso a través que se usan en una instrucción EXECUTE ('...', <arg-list>) AT <linkedsrv>
.
AT linked_server_name
Especifica que command_string se ejecuta en linked_server_name y los resultados, si hay alguno, se devuelven al cliente. linked_server_name debe hacer referencia a una definición de servidor vinculado existente en el servidor local. Los servidores vinculados se definen por medio de sp_addlinkedserver.
WITH <execute_option>
Opciones de ejecución posibles. Las opciones de
RESULT SETS
no se pueden especificar en una instrucciónINSERT...EXECUTE
.
AT DATA_SOURCE data_source_name
se aplica a: SQL Server 2019 (15.x) y versiones posteriores.
Especifica que command_string se ejecuta en data_source_name y los resultados, si los hubiera, se devuelven al cliente.
data_source_name debe hacer referencia a una definición de EXTERNAL DATA SOURCE
existente en la base de datos. Solo se admiten los orígenes de datos que apuntan a SQL Server. Además, para los orígenes de datos del clúster de macrodatos de SQL Server que apuntan al grupo de proceso, al grupo de datos o al grupo de almacenamiento se admiten. Los orígenes de datos se definen mediante CREATE EXTERNAL DATA SOURCE.
WITH <execute_option>
Opciones de ejecución posibles. Las opciones de
RESULT SETS
no se pueden especificar en una instrucciónINSERT...EXECUTE
.Término Definición RECOMPILE
Fuerza que se compile, use y descarte un nuevo plan después de ejecutar el módulo. Si hay un plan de consulta existente para el módulo, este plan permanece en la memoria caché.
Use esta opción si el parámetro que proporciona es atípico o si los datos han cambiado significativamente. Esta opción no se usa para procedimientos almacenados extendidos. Se recomienda usar esta opción con moderación porque es costosa.
Nota: No se puede usarWITH RECOMPILE
al llamar a un procedimiento almacenado que usaOPENDATASOURCE
sintaxis. La opciónWITH RECOMPILE
se omite cuando se especifica un nombre de objeto de cuatro partes.
Nota:RECOMPILE
no se admite con funciones escalares definidas por el usuario compiladas de forma nativa. Si necesita volver a compilar, use sp_recompile.RESULT SETS UNDEFINED
Esta opción no proporciona ninguna garantía de qué resultados, si los hay, se devuelven y no se proporciona ninguna definición. La instrucción se ejecuta sin errores si se devuelve algún resultado o si no se devuelve ninguno. RESULT SETS UNDEFINED
es el comportamiento predeterminado si no se proporciona un result_sets_option.
En el caso de las funciones escalares definidas por el usuario interpretadas y las funciones escalares definidas por el usuario compiladas de forma nativa, esta opción no es operativa porque las funciones nunca devuelven un conjunto de resultados.
se aplica a: SQL Server 2012 (11.x) y versiones posteriores, y Azure SQL Database.RESULT SETS NONE
Garantiza que la instrucción EXECUTE
no devuelve ningún resultado. Si se devuelve algún resultado, se anula el lote.
En el caso de las funciones escalares definidas por el usuario interpretadas y las funciones escalares definidas por el usuario compiladas de forma nativa, esta opción no es operativa porque las funciones nunca devuelven un conjunto de resultados.
se aplica a: SQL Server 2012 (11.x) y versiones posteriores, y Azure SQL Database.<result_sets_definition>
Proporciona una garantía de que el resultado vuelve como se especifica en el result_sets_definition
. En el caso de instrucciones que devuelvan varios conjuntos de resultados, proporcione varias secciones result_sets_definition. Agregue cada result_sets_definition entre paréntesis, separados por comas. Para obtener más información, consulte<result_sets_definition>
más adelante en este artículo.
Esta opción siempre genera un error con las funciones escalares definidas por el usuario y compiladas de forma nativa, porque este tipo de funciones no devuelve nunca un conjunto de resultados.
se aplica a: SQL Server 2012 (11.x) y versiones posteriores, y Azure SQL Database.<result_sets_definition>
describe los conjuntos de resultados devueltos por las instrucciones ejecutadas. Las cláusulas delresult_sets_definition
tienen el siguiente significado:Término Definición { column_name data_type
[ COLLATE collation_name ]
[NULL | NOT NULL] }Consulte la tabla siguiente. db_name Nombre de la base de datos que contiene la función con valores de tabla, vista o tabla. schema_name Nombre del esquema que posee la función con valores de tabla, vista o tabla. table_name | view_name | table_valued_function_name Especifica que las columnas devueltas son las especificadas en la función con valores de tabla, vista o tabla denominada. Las variables de tabla, las tablas temporales y los sinónimos no se admiten en la sintaxis del objeto AS. AS TYPE [ schema_name. ]table_type_name Especifica que las columnas devueltas son las especificadas en el tipo de tabla. AS FOR XML Especifica que los resultados XML de la instrucción o del procedimiento almacenado llamado por la instrucción EXECUTE
se convierten en el formato como si fueran generados por una instrucciónSELECT ... FOR XML ...
. Se quita todo el formato de las directivas de tipo de la instrucción original y los resultados devueltos son como si no se especificara ninguna directiva de tipo. AS FOR XML no convierte los resultados tabulares no XML de la instrucción ejecutada ni del procedimiento almacenado en XML.Término Definición column_name Los nombres de cada columna. Si el número de columnas es diferente al del conjunto de resultados, se produce un error y se anula el lote. Si el nombre de una columna es diferente al del conjunto de resultados, el nombre de columna devuelto se establecerá en el nombre definido. data_type Los tipos de datos de cada columna. Si los tipos de datos son diferentes, se realiza una conversión implícita al tipo de datos definido. Si la conversión produce un error, se anula el lote COLLATE collation_name La intercalación de cada columna. Si hay un error de coincidencia de intercalación, se intenta una intercalación implícita. Si se produce un error, se anula el lote. NULL | NOT NULL La nulabilidad de cada columna. Si la nulabilidad definida es NOT NULL
y los datos devueltos contienen valores NULL, se produce un error y se anula el lote. Si no se especifica, el valor predeterminado se ajusta a la configuración de las opciones deANSI_NULL_DFLT_ON
yANSI_NULL_DFLT_OFF
.El conjunto de resultados real que se devuelve durante la ejecución puede diferir del resultado definido mediante la cláusula
WITH RESULT SETS
de una de las maneras siguientes: número de conjuntos de resultados, número de columnas, nombre de columna, nulabilidad y tipo de datos. Si el número de conjuntos de resultados es diferente, se produce un error y se anula el lote.
Observaciones
Los parámetros se pueden proporcionar mediante valor o mediante @parameter_name = valor. Un parámetro no forma parte de una transacción; Por lo tanto, si se cambia un parámetro en una transacción que se revierte más adelante, el valor del parámetro no vuelve a su valor anterior. El valor devuelto al procedimiento llamante es siempre el valor del parámetro en el momento en que finaliza el módulo llamado.
El anidamiento tiene lugar cuando un módulo llama a otro o ejecuta código administrado que hace referencia a un módulo CLR, un tipo definido por el usuario o un agregado. El nivel de anidamiento se incrementa cuando la referencia de código administrado o módulo llamado inicia la ejecución y disminuye cuando finaliza la referencia de código administrado o módulo llamado. Si se supera el máximo de 32 niveles de anidamiento, habrá un error de la cadena completa de llamada. El nivel de anidamiento actual se almacena en la función del sistema @@NESTLEVEL
.
Dado que los procedimientos almacenados remotos y los procedimientos almacenados extendidos no están dentro del ámbito de una transacción (a menos que se emitan dentro de una instrucción BEGIN DISTRIBUTED TRANSACTION
o cuando se usen con varias opciones de configuración), los comandos ejecutados a través de llamadas a ellas no se pueden revertir. Para obtener más información, vea Procedimientos almacenados del sistema y BEGIN DISTRIBUTED TRANSACTION.
Al usar variables de cursor, si ejecuta un procedimiento que pasa una variable de cursor con un cursor asignado a él, se produce un error.
No es necesario especificar la palabra clave EXECUTE
al ejecutar módulos si la instrucción es la primera de un lote.
Para obtener más información específica sobre los procedimientos almacenados clR, consulte procedimientos almacenados clR.
Uso de EXECUTE con procedimientos almacenados
No es necesario especificar la palabra clave EXECUTE
al ejecutar procedimientos almacenados cuando la instrucción es la primera de un lote.
Los procedimientos almacenados del sistema de SQL Server comienzan con los caracteres sp_
. Se almacenan físicamente en la base de datos de recursos de , pero aparecen lógicamente en el esquema sys de cada base de datos definida por el usuario y del sistema. Cuando se ejecuta un procedimiento almacenado del sistema, ya sea en un lote o en un módulo, como una función o un procedimiento almacenado y definido por el usuario, se recomienda calificar el nombre del procedimiento almacenado con el nombre del esquema sys.
Los procedimientos almacenados extendidos del sistema de SQL Server comienzan con los caracteres xp_
, y se encuentran en el esquema dbo de la base de datos de master
. Al ejecutar un procedimiento almacenado extendido del sistema, ya sea en un lote o dentro de un módulo como un procedimiento almacenado o una función definidos por el usuario, se recomienda calificar el nombre del procedimiento almacenado con master.dbo
.
Cuando se ejecuta un procedimiento almacenado definido por el usuario, ya sea en un proceso por lotes o en un módulo como una función o un procedimiento almacenado definidos por el usuario, se recomienda que califique el nombre del procedimiento almacenado con un nombre de esquema. No se recomienda asignar un nombre a un procedimiento almacenado definido por el usuario con el mismo nombre que un procedimiento almacenado del sistema. Para obtener más información sobre cómo ejecutar procedimientos almacenados, vea Ejecutar un procedimiento almacenado.
Uso de EXECUTE con una cadena de caracteres
En SQL Server, se pueden especificar los tipos de datos varchar(max) y nvarchar(max) que permiten cadenas de caracteres de hasta 2 gigabytes de datos.
Los cambios en el contexto de la base de datos solo duran hasta el final de la instrucción EXECUTE
. Por ejemplo, después de ejecutar el EXECUTE
de esta instrucción siguiente, el contexto de la base de datos se master
.
USE master;
EXECUTE ('USE AdventureWorks2022; SELECT BusinessEntityID, JobTitle FROM HumanResources.Employee;');
Cambio de contexto
Puede utilizar la cláusula AS { LOGIN | USER } = '<name>'
para cambiar el contexto de ejecución de una instrucción dinámica. Cuando el cambio de contexto se especifica como EXECUTE ('string') AS <context_specification>
, la duración del cambio de contexto se limita al ámbito de la consulta que se está ejecutando.
Especificar un nombre de usuario o de inicio de sesión
El nombre de usuario o de inicio de sesión especificado en AS { LOGIN | USER } = '<name>'
debe existir como entidad de seguridad en sys.database_principals
o sys.server_principals
respectivamente, o se produce un error en la instrucción . Además, se deben conceder IMPERSONATE
permisos en la entidad de seguridad. A menos que el autor de la llamada sea el propietario de la base de datos o sea miembro del rol fijo de servidor sysadmin, la entidad de seguridad debe existir incluso cuando el usuario acceda a la base de datos o instancia de SQL Server a través de una pertenencia a grupos de Windows. Por ejemplo, supongamos las siguientes condiciones:
CompanyDomain\SQLUsers
grupo tiene acceso a la base de datosSales
.CompanyDomain\SqlUser1
es miembro deSQLUsers
y, por lo tanto, tiene acceso implícito a la base de datos deSales
.
Aunque CompanyDomain\SqlUser1
tiene acceso a la base de datos a través de la pertenencia al grupo de SQLUsers
, se produce un error en la instrucción EXECUTE @string_variable AS USER = 'CompanyDomain\SqlUser1'
porque CompanyDomain\SqlUser1
no existe como entidad de seguridad en la base de datos.
Procedimientos recomendados
Especifique un inicio de sesión o usuario que tenga al menos los privilegios requeridos para realizar las operaciones definidas en la instrucción o el módulo. Por ejemplo, no especifique un nombre de inicio de sesión, que tenga permisos de nivel de servidor, si solo se requieren permisos de nivel de base de datos. O bien, no especifique una cuenta de propietario de la base de datos a menos que se requieran esos permisos.
Permisos
Los permisos no son necesarios para ejecutar la instrucción EXECUTE
. Sin embargo, los permisos son necesarios en los elementos protegibles a los que se hace referencia dentro de la cadena de EXECUTE
. Por ejemplo, si la cadena contiene una instrucción INSERT
, el autor de la llamada de la instrucción EXECUTE
debe tener INSERT
permiso en la tabla de destino. Los permisos se comprueban en el momento en que se encuentra EXECUTE
instrucción, incluso si la instrucción EXECUTE
está incluida en un módulo.
EXECUTE
permisos para un módulo de forma predeterminada con el propietario del módulo, que puede transferirlos a otros usuarios. Cuando se ejecuta un módulo que ejecuta una cadena, los permisos se comprueban en el contexto del usuario que ejecuta el módulo, no en el contexto del usuario que creó el módulo. Sin embargo, si el mismo usuario posee el módulo de llamada y el módulo al que se llama, EXECUTE
comprobación de permisos no se realiza para el segundo módulo.
Si el módulo accede a otros objetos de base de datos, la ejecución se realiza correctamente cuando tiene EXECUTE
permiso en el módulo y se cumple una de las condiciones siguientes:
El módulo está marcado como
EXECUTE AS USER
oEXECUTE AS SELF
, y el propietario del módulo tiene los permisos correspondientes en el objeto al que se hace referencia. Para obtener más información sobre la suplantación dentro de un módulo, consulte cláusula EXECUTE AS.El módulo está marcado
EXECUTE AS CALLER
y tiene los permisos correspondientes en el objeto .El módulo está marcado como
EXECUTE AS <user_name>
y<user_name>
tiene los permisos correspondientes en el objeto .
Permisos de cambio de contexto
Para especificar EXECUTE AS
en un inicio de sesión, el autor de la llamada debe tener IMPERSONATE
permisos en el nombre de inicio de sesión especificado. Para especificar EXECUTE AS
en un usuario de base de datos, el autor de la llamada debe tener permisos IMPERSONATE
en el nombre de usuario especificado. Cuando no se especifica ningún contexto de ejecución o se especifica EXECUTE AS CALLER
, no se requieren IMPERSONATE
permisos.
Ejemplos: SQL Server
Los ejemplos de código de Transact-SQL de este artículo usan la base de datos de ejemplo de AdventureWorks2022
o AdventureWorksDW2022
, que puede descargar de la página principal ejemplos de Microsoft SQL Server y proyectos de comunidad.
A. Uso de EXECUTE para pasar un único parámetro
El procedimiento almacenado uspGetEmployeeManagers
en la base de datos AdventureWorks2022 espera un parámetro (@EmployeeID
). En el siguiente ejemplo se ejecuta el procedimiento almacenadouspGetEmployeeManagers
con Employee ID 6
como valor del parámetro.
EXECUTE dbo.uspGetEmployeeManagers 6;
GO
La variable se puede llamar explícitamente en la ejecución:
EXECUTE dbo.uspGetEmployeeManagers @EmployeeID = 6;
GO
Si lo siguiente es la primera instrucción de un lote o un script de sqlcmd, no es necesario EXECUTE
.
dbo.uspGetEmployeeManagers 6;
GO
--Or
dbo.uspGetEmployeeManagers @EmployeeID = 6;
GO
B. Uso de varios parámetros
En el ejemplo siguiente se ejecuta el procedimiento almacenado spGetWhereUsedProductID
en la base de datos AdventureWorks2022. Pasa dos parámetros: el primer parámetro es un identificador de producto (819
) y el segundo parámetro @CheckDate
es un valor datetime.
DECLARE @CheckDate AS DATETIME;
SET @CheckDate = GETDATE();
EXECUTE dbo.uspGetWhereUsedProductID 819, @CheckDate;
GO
C. Usar EXECUTE 'tsql_string' con una variable
En el ejemplo siguiente se muestra cómo trata EXECUTE
las cadenas construidas dinámicamente que contienen variables. Este ejemplo crea el cursor tables_cursor
para que mantenga una lista de todas las tablas definidas por el usuario en la base de datos AdventureWorks2022
y, a continuación, usa esa lista para volver a generar todos los índices de las tablas.
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. Uso de EXECUTE con un procedimiento almacenado remoto
En el ejemplo siguiente se ejecuta el procedimiento almacenado uspGetEmployeeManagers
en el servidor remoto SQLSERVER1
y se almacena el estado de retorno, que indica éxito o fracaso, en @retstat
.
DECLARE @retstat AS INT;
EXECUTE
@retstat = SQLSERVER1.AdventureWorks2022.dbo.uspGetEmployeeManagers
@BusinessEntityID = 6;
E. Uso de EXECUTE con una variable de procedimiento almacenado
En el ejemplo siguiente se crea una variable que representa un nombre de procedimiento almacenado.
DECLARE @proc_name AS VARCHAR (30);
SET @proc_name = 'sys.sp_who';
EXECUTE @proc_name;
F. Uso de EXECUTE con DEFAULT
En el ejemplo siguiente se crea un procedimiento almacenado con valores predeterminados para el primer y tercer parámetro. Cuando se ejecuta el procedimiento, estos valores predeterminados se insertan como parámetros primero y tercero si no se pasa ningún valor en la llamada o si se especifica el valor predeterminado. Observe las distintas formas en las que se puede usar la palabra clave DEFAULT
.
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
El procedimiento almacenado Proc_Test_Defaults
se puede ejecutar en muchas combinaciones.
-- 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. Uso de EXECUTE con AT linked_server_name
En el siguiente ejemplo se pasa una cadena de comandos a un servidor remoto. Crea un servidor vinculado SeattleSales
que apunta a otra instancia de SQL Server y ejecuta una instrucción DDL (CREATE TABLE
) contra ese 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
En el siguiente ejemplo se ejecuta el procedimiento almacenado Proc_Test_Defaults
y se exige que un nuevo plan de consulta se compile, se use y se descarte después de ejecutar el módulo.
EXECUTE dbo.Proc_Test_Defaults @p2 = 'A' WITH RECOMPILE;
GO
I. Uso de EXECUTE con una función definida por el usuario
En el siguiente ejemplo se ejecuta la función escalar definida por el usuario ufnGetSalesOrderStatusText
en la base de datos AdventureWorks2022. Usa la variable @returnstatus
para almacenar el valor devuelto por la función. La función espera un parámetro de entrada, @Status
. Se define como un tipo de datos tinyint.
DECLARE @returnstatus AS NVARCHAR (15);
SET @returnstatus = NULL;
EXECUTE
@returnstatus = dbo.ufnGetSalesOrderStatusText
@Status = 2;
PRINT @returnstatus;
GO
J. Uso de EXECUTE para consultar una base de datos de Oracle en un servidor vinculado
En el siguiente ejemplo se ejecutan varias instrucciones de SELECT
en el servidor Oracle remoto. El ejemplo empieza agregando el servidor Oracle como un servidor vinculado y creando el inicio de sesión del 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 cambiar el contexto a otro usuario
En el siguiente ejemplo se ejecuta una cadena Transact-SQL que crea una tabla y se especifica la cláusula AS USER
para cambiar el contexto de ejecución de la instrucción del autor de llamada a User1
. El motor de base de datos comprueba los permisos de User1
cuando se ejecuta la instrucción .
User1
debe existir como un usuario en la base de datos y debe tener permiso para crear tablas en el esquema Sales
; de lo contrario, se producirá un error en la instrucción.
EXECUTE ('CREATE TABLE Sales.SalesTable (SalesID INT, SalesName VARCHAR(10));')
AS USER = 'User1';
GO
L. Uso de un parámetro con EXECUTE y AT linked_server_name
En el ejemplo siguiente se pasa una cadena de comando a un servidor remoto mediante un marcador de posición (signo de interrogación, ?
) para un parámetro. El ejemplo crea un servidor vinculado SeattleSales
que apunta a otra instancia de SQL Server y ejecuta una instrucción SELECT
en ese servidor vinculado. La instrucción SELECT
utiliza el signo de interrogación como marcador de posición para el parámetro ProductID
(952
), que se suministra a continuación de la instrucción.
-- 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. Uso de EXECUTE para redefinir un único conjunto de resultados
se aplica a: SQL Server 2012 (11.x) y versiones posteriores, y Azure SQL Database.
Algunos de los ejemplos anteriores ejecutaron EXECUTE dbo.uspGetEmployeeManagers 6;
que devolvieron siete columnas. En el ejemplo siguiente se muestra cómo usar la sintaxis WITH RESULT SET
para cambiar los nombres y los tipos de datos del conjunto de resultados devuelto.
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
));
Hora Usar EXECUTE para redefinir dos conjuntos de resultados
se aplica a: SQL Server 2012 (11.x) y versiones posteriores, y Azure SQL Database.
Al ejecutar una instrucción que devuelve más de un conjunto de resultados, defina cada conjunto de resultados esperado. En el siguiente ejemplo de AdventureWorks2022
se crea un procedimiento que devuelve dos conjuntos de resultados. A continuación, el procedimiento se ejecuta mediante la cláusula WITH RESULT SETS
y especifica dos definiciones 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. Uso de EXECUTE con AT DATA_SOURCE data_source_name para consultar un servidor SQL Server remoto
se aplica a: SQL Server 2019 (15.x) y versiones posteriores.
En el ejemplo siguiente se pasa una cadena de comandos a un origen de datos externo que apunta a una instancia de SQL Server.
EXECUTE ( 'SELECT @@SERVERNAME' ) AT DATA_SOURCE my_sql_server;
GO
P. Uso de EXECUTE con AT DATA_SOURCE data_source_name para consultar el grupo de procesos en el clúster de macrodatos de SQL Server
se aplica a: SQL Server 2019 (15.x).
En el ejemplo siguiente se pasa una cadena de comandos a un origen de datos externo que apunta a un grupo de proceso de un clúster de macrodatos de SQL Server. En el ejemplo se crea un origen de datos SqlComputePool
en un grupo de proceso de un clúster de macrodatos de SQL Server y se ejecuta una instrucción SELECT
en el origen de datos.
CREATE EXTERNAL DATA SOURCE SqlComputePool
WITH (LOCATION = 'sqlcomputepool://controller-svc/default');
EXECUTE ('SELECT @@SERVERNAME') AT DATA_SOURCE SqlComputePool;
GO
Q. Uso de EXECUTE con AT DATA_SOURCE data_source_name para consultar el grupo de datos en el clúster de macrodatos de SQL Server
se aplica a: SQL Server 2019 (15.x).
En el ejemplo siguiente se pasa una cadena de comando a un origen de datos externo que apunta al grupo de procesos en el clúster de macrodatos (BDC) de SQL Server. En el ejemplo se crea un origen de datos SqlDataPool
en un grupo de datos de BDC y se ejecuta una instrucción SELECT
en el origen de datos.
CREATE EXTERNAL DATA SOURCE SqlDataPool
WITH (LOCATION = 'sqldatapool://controller-svc/default');
EXECUTE ('SELECT @@SERVERNAME') AT DATA_SOURCE SqlDataPool;
GO
R. Uso de EXECUTE con AT DATA_SOURCE data_source_name para consultar el grupo de almacenamiento en el clúster de macrodatos de SQL Server
se aplica a: SQL Server 2019 (15.x).
En el ejemplo siguiente se pasa una cadena de comandos a un origen de datos externo que apunta a un grupo de proceso de un clúster de macrodatos de SQL Server. En el ejemplo se crea un origen de datos SqlStoragePool
en un grupo de datos de un clúster de macrodatos de SQL Server y se ejecuta una instrucción SELECT
en el origen de datos.
CREATE EXTERNAL DATA SOURCE SqlStoragePool
WITH (LOCATION = 'sqlhdfs://controller-svc/default');
EXECUTE ('SELECT @@SERVERNAME') AT DATA_SOURCE SqlStoragePool;
GO
Ejemplos: Azure Synapse Analytics
Los ejemplos de código de Transact-SQL de este artículo usan la base de datos de ejemplo de AdventureWorks2022
o AdventureWorksDW2022
, que puede descargar de la página principal ejemplos de Microsoft SQL Server y proyectos de comunidad.
R: Ejecución básica de procedimientos
Ejecute un procedimiento almacenado:
EXECUTE proc1;
Llame a un procedimiento almacenado con el nombre determinado en tiempo de ejecución:
EXECUTE ('EXECUTE ' + @var);
Llame a un procedimiento almacenado desde un procedimiento almacenado:
CREATE sp_first AS EXECUTE sp_second; EXECUTE sp_third;
B: Ejecutar cadenas
Ejecute una cadena SQL:
EXECUTE ('SELECT * FROM sys.types');
Ejecute una cadena anidada:
EXECUTE ('EXECUTE (''SELECT * FROM sys.types'')');
Ejecute una variable de cadena:
DECLARE @stringVar AS NVARCHAR (100);
SET @stringVar = N'SELECT name FROM' + ' sys.sql_logins';
EXECUTE (@stringVar);
C: Procedimientos con parámetros
En el ejemplo siguiente se crea un procedimiento con parámetros y se muestran tres maneras de ejecutar el procedimiento:
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
Ejecute mediante parámetros posicionales:
EXECUTE ProcWithParameters N'%arm%', N'Black';
Ejecute con parámetros con nombre en orden:
EXECUTE ProcWithParameters
@name = N'%arm%',
@color = N'Black';
Ejecute con parámetros con nombre fuera del orden:
EXECUTE ProcWithParameters
@color = N'Black',
@name = N'%arm%';
GO
Contenido relacionado
- @@NESTLEVEL (Transact-SQL)
- DECLARE @local_variable (Transact-SQL)
- EXECUTE AS (cláusula de Transact-SQL)
- osql (utilidad)
- Entidades de seguridad (motor de base de datos)
- REVERT (Transact-SQL)
- sp_addlinkedserver (Transact-SQL)
- Utilidad sqlcmd
- SUSER_NAME (Transact-SQL)
- sys.database_principals (Transact-SQL)
- sys.server_principals (Transact-SQL)
- USER_NAME (Transact-SQL)
- OPENDATASOURCE (Transact-SQL)
- Funciones escalares definidas por el usuario para OLTP en memoria