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

ESTE TEMA SE APLICA A: síSQL Server (a partir de 2008)síAzure SQL DatabasesíAzure SQL Data Warehouse síAlmacenamiento de datos paralelos THIS TOPIC APPLIES TO: yesSQL Server (starting with 2008)yesAzure SQL DatabaseyesAzure SQL Data Warehouse yesParallel Data Warehouse

Ejecuta una cadena de comandos o una cadena de caracteres dentro de un lote de Transact-SQLTransact-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.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. La instrucción EXECUTE se puede usar para enviar comandos de paso a través a los servidores vinculados.The EXECUTE statement can be used to send pass-through commands to linked servers. Adicionalmente, el contexto en el que se ejecuta una cadena o un comando se puede establecer de forma explícita.Additionally, the context in which a string or command is executed can be explicitly set. Los metadatos para el conjunto de resultados se pueden definir usando las opciones de WITH RESULT SETS.Metadata for the result set can be defined by using the WITH RESULT SETS options.

Importante

Antes de llamar a EXECUTE con una cadena de caracteres, valide la cadena de caracteres.Before you call EXECUTE with a character string, validate the character string. Nunca ejecute un comando construido desde la entrada de usuario que no se haya validado.Never execute a command constructed from user input that has not been validated.

Icono de vínculo de tema Convenciones de sintaxis de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxisSyntax

-- 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
Es una variable entera opcional que almacena el estado de retorno de un módulo.Is an optional integer variable that stores the return status of a module. Esta variable debe declararse en el proceso por lotes, en el procedimiento almacenado o en la función para que se pueda utilizar en una instrucción EXECUTE.This variable must be declared in the batch, stored procedure, or function before it is used in an EXECUTE statement.

Cuando se usa para invocar una función escalar definida por el usuario, la variable @return_status puede ser de cualquier tipo de datos 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
Es el nombre, completo o no, del procedimiento almacenado o la función escalar definida por el usuario a la que debe llamar.Is the fully qualified or nonfully qualified name of the stored procedure or scalar-valued user-defined function to call. Los nombres de módulo deben cumplir las reglas de los identificadores.Module names must comply with the rules for identifiers. Los nombres de los procedimientos almacenados extendidos distinguen siempre entre mayúsculas y minúsculas, sin tener en cuenta la intercalación del servidor.The names of extended stored procedures are always case-sensitive, regardless of the collation of the server.

Un módulo que se haya creado en otra base de datos se puede ejecutar si el usuario que lo ejecuta es el propietario del módulo o dispone de los permisos adecuados para ejecutar el módulo en esa base de datos.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. Un módulo puede ejecutarse en otro servidor que esté ejecutando SQL ServerSQL 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.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. Si se especifica un nombre de servidor, pero no se especifica nombre de base de datos, Motor de base de datos de SQL ServerSQL Server Database Engine busca el módulo en la base de datos predeterminada del usuario.If a server name is specified but no database name is specified, the Motor de base de datos de SQL ServerSQL Server Database Engine looks for the module in the default database of the user.

;number;number
Se aplica a: de SQL Server 2008SQL Server 2008 a SQL Server 2017SQL Server 2017Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017

Es un entero opcional que se utiliza para agrupar procedimientos que tengan el mismo nombre.Is an optional integer that is used to group procedures of the same name. Este parámetro no se utiliza para los procedimientos almacenados extendidos.This parameter is not used for extended stored procedures.

Nota

Esta característica está en modo de mantenimiento y es posible que no se incluya en una versión futura de Microsoft SQL Server.This feature is in maintenance mode and may be removed in a future version of Microsoft SQL Server. Evite utilizar esta característica en nuevos trabajos de desarrollo y tenga previsto modificar las aplicaciones que actualmente la utilizan.Avoid using this feature in new development work, and plan to modify applications that currently use this feature.

Para más información sobre los grupos de procedimientos, vea CREATE PROCEDURE (Transact-SQL).For more information about procedure groups, see CREATE PROCEDURE (Transact-SQL).

@module_name_var@module_name_var
Es el nombre de la variable definida localmente, que representa el nombre de un módulo.Is the name of a locally defined variable that represents a module name.

Puede ser una variable que contiene el nombre de una función escalar definida por el usuario y compilada de forma nativa.This can be a variable that holds the name of a natively compiled, scalar user-defined function.

@parameter@parameter
Es el parámetro de module_name, como se define en el módulo.Is the parameter for module_name, as defined in the module. Los nombres de parámetro deben precederse del signo (@).Parameter names must be preceded by the at sign (@). Cuando se usa con el formato @parameter_name=value, los nombres de parámetro y las constantes no tienen que proporcionarse en el orden en el que se han definido en el 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. Sin embargo, si el formato @parameter_name=value se usa para cualquier parámetro, se debe usar para todos los parámetros siguientes.However, if the @parameter_name=value form is used for any parameter, it must be used for all subsequent parameters.

De manera predeterminada, los parámetros admiten valores NULL.By default, parameters are nullable.

valuevalue
Es el valor del parámetro que se va a pasar al módulo o a un comando de paso a través.Is the value of the parameter to pass to the module or pass-through command. Si no se especifican los nombres de los parámetros, sus valores deben proporcionarse en el orden definido en el módulo.If parameter names are not specified, parameter values must be supplied in the order defined in the module.

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.When executing pass-through commands against linked servers, the order of the parameter values depends on the OLE DB provider of the linked server. La mayoría de proveedores OLE DB enlazan valores a parámetros de izquierda a derecha.Most OLE DB providers bind values to parameters from left to right.

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.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. Si el valor de un parámetro es una palabra clave, ésta debe escribirse entre comillas dobles.If the value of a parameter is a keyword, the keyword must be enclosed in double quotation marks.

Si se define un valor predeterminado en el módulo, un usuario podrá ejecutar el módulo sin especificar ningún parámetro.If a default is defined in the module, a user can execute the module without specifying a parameter.

El valor predeterminado puede ser también NULL.The default can also be NULL. Generalmente, la definición del módulo especifica la acción que debe realizarse si el valor del parámetro es NULL.Generally, the module definition specifies the action that should be taken if a parameter value is NULL.

@variable@variable
Es la variable que almacena un parámetro o un parámetro devuelto.Is the variable that stores a parameter or a return parameter.

OUTPUTOUTPUT
Especifica que el módulo o la cadena de comandos devuelve un parámetro.Specifies that the module or command string returns a parameter. El parámetro coincidente del módulo o de la cadena de comandos debe haberse creado también con la palabra clave OUTPUT.The matching parameter in the module or command string must also have been created by using the keyword OUTPUT. Utilice esta palabra clave cuando use variables de cursor como parámetros.Use this keyword when you use cursor variables as parameters.

Si value se define como OUTPUT de un módulo que se ejecuta contra un servidor vinculado, cualquier cambio realizado por el proveedor OLE DB en el @parameter correspondiente se volverá a copiar en la variable al final de la ejecución del 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.

Si se usan parámetros OUTPUT y la intención es usar los valores devueltos en otras instrucciones del lote o módulo que llama, el valor del parámetro se debe pasar como variable, por ejemplo, @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. No se puede ejecutar un módulo en el que se especifique OUTPUT para un parámetro que no se ha definido como parámetro OUTPUT en el módulo.You cannot execute a module by specifying OUTPUT for a parameter that is not defined as an OUTPUT parameter in the module. Las constantes no se pueden pasar al módulo mediante OUTPUT; el parámetro devuelto requiere un nombre de variable.Constants cannot be passed to module by using OUTPUT; the return parameter requires a variable name. El tipo de datos de la variable debe estar declarado y se le debe haber asignado un valor para poder ejecutar el procedimiento.The data type of the variable must be declared and a value assigned before executing the procedure.

Cuando se usa EXECUTE contra un procedimiento almacenado remoto, o se ejecuta un comando de paso a través contra un servidor vinculado, los parámetros OUTPUT no pueden ser ninguno de los tipos de datos de objeto grande (LOB).When EXECUTE is used against a remote stored procedure, or to execute a pass-through command against a linked server, OUTPUT parameters cannot be any one of the large object (LOB) data types.

Los parámetros devueltos pueden ser de cualquier tipo de datos, excepto del tipo de datos LOB.Return parameters can be of any data type except the LOB data types.

DEFAULTDEFAULT
Proporciona el valor predeterminado del parámetro tal como se define en el módulo.Supplies the default value of the parameter as defined in the module. Cuando el módulo espera un valor para un parámetro que no tiene un valor predeterminado definido y no se encuentra un parámetro o se ha especificado la palabra clave DEFAULT, se produce un error.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
Es el nombre de una variable local.Is the name of a local variable. @string_variable puede ser cualquier tipo de datos char, varchar, nchar o nvarchar. @string_variable can be any char, varchar, nchar, or nvarchar data type. Esto engloba los tipos de datos (max).These include the (max) data types.

[N] 'tsql_string'[N] 'tsql_string'
Es una cadena constante.Is a constant string. tsql_string puede ser cualquier tipo de datos nvarchar o varchar.tsql_string can be any nvarchar or varchar data type. Si se incluye N, la cadena se interpreta como del tipo de datos nvarchar.If the N is included, the string is interpreted as nvarchar data type.

AS <context_specification>AS <context_specification>
Especifica el contexto en el que se ejecuta la instrucción.Specifies the context in which the statement is executed.

LoginLOGIN
Se aplica a: de SQL Server 2008SQL Server 2008 a SQL Server 2017SQL Server 2017Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017

Especifica que el contexto que se va a suplantar es un inicio de sesión.Specifies the context to be impersonated is a login. El ámbito de la suplantación es el servidor.The scope of impersonation is the server.

UserUSER
Especifica que el contexto de ejecución que se va a suplantar es un usuario de la base de datos actual.Specifies the context to be impersonated is a user in the current database. El ámbito de la suplantación se restringe a la base de datos actual.The scope of impersonation is restricted to the current database. Un cambio de contexto a un usuario de base de datos no hereda los permisos de nivel de servidor de ese usuario.A context switch to a database user does not inherit the server-level permissions of that user.

Importante

Mientras el cambio de contexto al usuario de base de datos esté activo, cualquier intento de acceso a recursos fuera de la base de datos provocará que la instrucción genere errores.While the context switch to the database user is active, any attempt to access resources outside the database will cause the statement to fail. Esto incluye instrucciones USE database, consultas distribuidas y consultas que hacen referencia a otra base de datos por medio de identificadores de tres o cuatro partes.This includes USE database statements, distributed queries, and queries that reference another database by using three- or four-part identifiers.

'name''name'
Es un nombre válido de inicio de sesión o de usuario.Is a valid user or login name. name debe ser miembro del rol fijo de servidor o existir como entidad de seguridad en sys.database_principals o 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 no puede ser una cuenta integrada, como NT AUTHORITY\LocalService, NT AUTHORITY\NetworkService o NT AUTHORITY\LocalSystem.name cannot be a built-in account, such as NT AUTHORITY\LocalService, NT AUTHORITY\NetworkService, or NT AUTHORITY\LocalSystem.

Para más información, vea Especificar un nombre de inicio de sesión o usuario más adelante en este tema.For more information, see Specifying a User or Login Name later in this topic.

[N] 'command_string'[N] 'command_string'
Es una cadena constante que contiene el comando que se va a pasar a través al servidor vinculado.Is a constant string that contains the command to be passed through to the linked server. Si se incluye N, la cadena se interpreta como del tipo de datos nvarchar.If the N is included, the string is interpreted as nvarchar data type.

[?][?]
Indica los parámetros para los que se suministran valores en los comandos de paso a través <arg-list> que se usan en una instrucción 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
Se aplica a: de SQL Server 2008SQL Server 2008 a SQL Server 2017SQL Server 2017Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017

Especifica que command_string se ejecuta en linked_server_name y los resultados, si hay alguno, se devuelven al cliente.Specifies that command_string is executed against linked_server_name and results, if any, are returned to the client. linked_server_name debe hacer referencia a una definición de servidor vinculado existente en el servidor local.linked_server_name must refer to an existing linked server definition in the local server. Los servidores vinculados se definen por medio de sp_addlinkedserver.Linked servers are defined by using sp_addlinkedserver.

WITH <execute_option>WITH <execute_option>
Opciones de ejecución posibles.Possible execute options. Las opciones de RESULT SETS no se pueden especificar en una instrucción INSERT… EXEC.The RESULT SETS options cannot be specified in an INSERT…EXEC statement.

TérminoTerm DefiniciónDefinition
RECOMPILERECOMPILE Fuerza que se compile, use y descarte un nuevo plan después de ejecutar el módulo.Forces a new plan to be compiled, used, and discarded after the module is executed. Si hay algún plan de consulta existente para el módulo, este plan permanece en la memoria caché.If there is an existing query plan for the module, this plan remains in the cache.

Utilice esta opción si el parámetro que está proporcionando es atípico o si los datos han cambiado de forma significativa.Use this option if the parameter you are supplying is atypical or if the data has significantly changed. Esta opción no se utiliza para los procedimientos almacenados extendidos.This option is not used for extended stored procedures. Se recomienda que use esta opción con cautela, porque es costosa.We recommend that you use this option sparingly because it is expensive.

Nota: WITH RECOMPILE no se puede usar para llamar a un procedimiento almacenado que emplea la sintaxis OPENDATASOURCE.Note: You can not use WITH RECOMPILE when calling a stored procedure that uses OPENDATASOURCE syntax. La opción WITH RECOMPILE se omite cuando se especifica un nombre de objeto de cuatro partes.The WITH RECOMPILE option is ignored when a four-part object name is specified.

Nota: RECOMPILE no es compatible con las funciones escalares definidas por el usuario y compiladas de forma nativa.Note: RECOMPILE is not supported with natively compiled, scalar user-defined functions. Si necesita volver a compilar, use sp_recompile (Transact-SQL).If you need to recompile, use sp_recompile (Transact-SQL).
RESULT SETS UNDEFINEDRESULT SETS UNDEFINED Se aplica a: de SQL Server 2012 (11.x)SQL Server 2012 (11.x) a SQL Server 2017SQL Server 2017, Base de datos SQL de AzureAzure SQL Database.Applies to: SQL Server 2012 (11.x)SQL Server 2012 (11.x) through SQL Server 2017SQL Server 2017, Base de datos SQL de AzureAzure SQL Database.

Esta opción no proporciona ninguna garantía de que se devuelvan los resultados, si hay alguno, y no se proporciona ninguna definición.This option provides no guarantee of what results, if any, will be returned, and no definition is provided. La instrucción se ejecuta sin errores si se devuelve algún resultado o si no se devuelve ninguno.The statement executes without error if any results are returned or no results are returned. RESULT SETS UNDEFINED es el comportamiento predeterminado si no se proporciona una opción de conjuntos de resultados.RESULT SETS UNDEFINED is the default behavior if a result_sets_option is not provided.

En el caso de las funciones escalares definidas por el usuario tanto interpretadas como compiladas de forma nativa, esta opción no está operativa porque dichas funciones no devuelven nunca un 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 Se aplica a: de SQL Server 2012 (11.x)SQL Server 2012 (11.x) a SQL Server 2017SQL Server 2017, Base de datos SQL de AzureAzure SQL Database.Applies to: SQL Server 2012 (11.x)SQL Server 2012 (11.x) through SQL Server 2017SQL Server 2017, Base de datos SQL de AzureAzure SQL Database.

Garantiza que la instrucción de ejecución no devolverá ningún resultado.Guarantees that the execute statement will not return any results. Si se devuelve algún resultado, se anula el lote.If any results are returned the batch is aborted.

En el caso de las funciones escalares definidas por el usuario tanto interpretadas como compiladas de forma nativa, esta opción no está operativa porque dichas funciones no devuelven nunca un 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> Se aplica a: de SQL Server 2012 (11.x)SQL Server 2012 (11.x) a SQL Server 2017SQL Server 2017, Base de datos SQL de AzureAzure SQL Database.Applies to: SQL Server 2012 (11.x)SQL Server 2012 (11.x) through SQL Server 2017SQL Server 2017, Base de datos SQL de AzureAzure SQL Database.

Proporciona una garantía de que el resultado se devolverá tal y como se especifique en result_sets_definition.Provides a guarantee that the result will come back as specified in the result_sets_definition. En el caso de instrucciones que devuelvan varios conjuntos de resultados, proporcione varias secciones result_sets_definition.For statements that return multiple result sets, provide multiple result_sets_definition sections. Agregue cada result_sets_definition entre paréntesis, separados por comas.Enclose each result_sets_definition in parentheses, separated by commas. Para más información, vea <result_sets_definition> más adelante en este tema.For more information, see <result_sets_definition> later in this topic.

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.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> Se aplica a: de SQL Server 2012 (11.x)SQL Server 2012 (11.x) a SQL Server 2017SQL Server 2017, Base de datos SQL de AzureAzure SQL Database<result_sets_definition> Applies to: SQL Server 2012 (11.x)SQL Server 2012 (11.x) through SQL Server 2017SQL Server 2017, Base de datos SQL de AzureAzure SQL Database

Describe los conjuntos de resultados devueltos por las instrucciones ejecutadas.Describes the result sets returned by the executed statements. Las cláusulas de result_sets_definition tienen el significado siguienteThe clauses of the result_sets_definition have the following meaning

TérminoTerm DefiniciónDefinition
{{

column_namecolumn_name

data_typedata_type

[ COLLATE collation_name][ COLLATE collation_name]

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

}}
Vea la tabla siguiente.See the table below.
db_namedb_name El nombre de la base de datos que contiene la tabla, vista o función con valores de tabla.The name of the database containing the table, view or table valued function.
schema_nameschema_name El nombre del esquema propietario de la tabla, vista o función con valores de tabla.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 las columnas devueltas serán aquellas especificadas en la tabla, vista o función con valores de tabla con nombre.Specifies that the columns returned will be those specified in the table, view or table valued function named. Las variables de tabla, tablas temporales y sinónimos no se admiten en la sintaxis de objeto 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 las columnas devueltas serán aquellas especificadas en el tipo de tabla.Specifies that the columns returned will be those specified in the table type.
AS FOR XMLAS FOR XML Especifica que los resultados XML de la instrucción o el procedimiento almacenado llamado por la instrucción EXECUTE se convertirán al formato como si se hubieran generado mediante una instrucción SELECT …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 …FOR XML … .statement. Todo el formato de las directivas de tipo en la instrucción original se quita y los resultados devueltos son como si no se hubiera especificado ninguna directiva de tipo.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 no convierte los resultados tabulares que no son XML de la instrucción o el procedimiento almacenado ejecutado en XML.AS FOR XML does not convert non-XML tabular results from the executed statement or stored procedure into XML.
TérminoTerm DefiniciónDefinition
column_namecolumn_name Los nombres de cada columna.The names of each column. Si el número de columnas es diferente al del conjunto de resultados, se produce un error y se anula el lote.If the number of columns differs from the result set, an error occurs and the batch is aborted. Si el nombre de una columna es diferente al del conjunto de resultados, el nombre de columna devuelto se establecerá en el nombre 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 Los tipos de datos de cada columna.The data types of each column. Si los tipos de datos son diferentes, se realiza una conversión implícita al tipo de datos definido.If the data types differ, an implicit conversion to the defined data type is performed. Si la conversión produce un error, se anula el loteIf the conversion fails the batch is aborted
COLLATE collation_nameCOLLATE collation_name La intercalación de cada columna.The collation of each column. Si se produce un error de coincidencia de la intercalación, se intenta una intercalación implícita.If there is a collation mismatch, an implicit collation is attempted. Si se produce un error, se anula el lote.If that fails, the batch is aborted.
NULL | NOT NULLNULL | NOT NULL La nulabilidad de cada columna.The nullability of each column. Si la nulabilidad definida es NOT NULL y los datos devueltos contienen valores NULL, se produce un error y se anula el lote.If the defined nullability is NOT NULL and the data returned contains NULLs an error occurs and the batch is aborted. Si no se especifica, el valor predeterminado es conforme al valor de las opciones ANSI_NULL_DFLT_ON y 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.

El conjunto de resultados real devuelto durante la ejecución puede ser diferente del definido mediante la cláusula WITH RESULT SETS de una de las formas siguientes: número de conjuntos de resultados, número de columnas, nombre de columna, nulabilidad y tipo de datos.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. Si el número de conjuntos de resultados es diferente, se produce un error y se anula el lote.If the number of result sets differs, an error occurs and the batch is aborted.

NotasRemarks

Los parámetros se pueden proporcionar a través de value o usando @parameter_name=value.Parameters can be supplied either by using value or by using @parameter_name=value. Un parámetro no forma parte de una transacción; por tanto, si se cambia un parámetro en una transacción que se revierte posteriormente, el valor del parámetro no vuelve a su 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. El valor devuelto al procedimiento llamante es siempre el valor del parámetro en el momento en que finaliza el módulo llamado.The value returned to the caller is always the value at the time the module returns.

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.Nesting occurs when one module calls another or executes managed code by referencing a common language runtime (CLR) module, user-defined type, or aggregate. El nivel de anidamiento se aumenta cuando el código administrado o el módulo llamado comienzan la ejecución y disminuye cuando el código administrado o el módulo llamado terminan.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. Si se supera el máximo de 32 niveles de anidamiento, habrá un error de la cadena completa de llamada.Exceeding the maximum of 32 nesting levels causes the complete calling chain to fail. El nivel actual de anidamiento se almacena en la función del sistema @@NESTLEVEL.The current nesting level is stored in the @@NESTLEVEL system function.

Debido a que ni los procedimientos almacenados ni los procedimientos almacenados extendidos se encuentran dentro del ámbito de una transacción (a menos que se ejecuten en una instrucción BEGIN DISTRIBUTED TRANSACTION o que se utilicen con varias opciones de configuración), los comandos que se ejecutan mediante llamadas a ellos no se pueden revertir.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 más información, vea Procedimientos almacenados del sistema (Transact-SQL) y BEGIN DISTRIBUTED TRANSACTION (Transact-SQL).For more information, see System Stored Procedures (Transact-SQL) and BEGIN DISTRIBUTED TRANSACTION (Transact-SQL).

Se genera un error si usa y ejecuta un procedimiento que pasa, como parámetro de entrada, una variable de cursor con cursor asignado.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.

Cuando ejecute módulos, no es necesario que especifique la palabra clave EXECUTE si la instrucción es la primera de un lote.You do not have to specify the EXECUTE keyword when executing modules if the statement is the first one in a batch.

Para obtener información adicional específica de los procedimientos almacenados de CLR, consulte Procedimientos almacenados de CLR.For additional information specific to CLR stored procedures, see CLR Stored Procedures.

Utilizar EXECUTE con procedimientos almacenadosUsing EXECUTE with Stored Procedures

Cuando ejecute procedimientos almacenados, no es necesario que especifique la palabra clave EXECUTE si la instrucción es la primera de un 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.

Los procedimientos almacenados del sistema de SQL ServerSQL Server empiezan con los caracteres sp_. SQL ServerSQL Server system stored procedures start with the characters sp_. Se almacenan físicamente en la base de datos de recursos, pero aparecen lógicamente en el esquema sys de cada base de datos definida por el usuario y el sistema.They are physically stored in the Resource database, but logically appear in the sys schema of every system and user-defined database. 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.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.

Los procedimientos almacenados extendidos del sistema de SQL ServerSQL Server empiezan con los caracteres xp_, y se encuentran en el esquema dbo de la base de datos maestra. SQL ServerSQL Server system extended stored procedures start with the characters xp_, and these are contained in the dbo schema of the master database. Cuando se ejecuta un procedimiento almacenado extendido 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 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.

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.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. No se recomienda que denomine al procedimiento almacenado definido por el usuario con el mismo nombre que un procedimiento almacenado del sistema.We do not recommend that you name a user-defined stored procedure with the same name as a system stored procedure. Para más información sobre cómo ejecutar procedimientos almacenados, vea Ejecutar un procedimiento almacenado.For more information about executing stored procedures, see Execute a Stored Procedure.

Utilizar EXECUTE con una cadena de caracteresUsing EXECUTE with a Character String

En versiones anteriores de SQL ServerSQL Server, las cadenas de caracteres se limitaban a 8.000 bytes.In earlier versions of SQL ServerSQL Server, character strings are limited to 8,000 bytes. Esto requería la concatenación de grandes cadenas para la ejecución dinámica.This requires concatenating large strings for dynamic execution. En SQL ServerSQL Server, se pueden especificar los tipos de datos varchar(max) y nvarchar(max) que permiten cadenas de caracteres de hasta 2 gigabytes de datos.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.

Los cambios en el contexto de la base de datos solo duran hasta el final de la instrucción EXECUTE.Changes in database context last only until the end of the EXECUTE statement. Por ejemplo, después de ejecutar EXEC en la siguiente instrucción, el contexto de la base de datos será el de base de datos maestra.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;');  

Cambio de contextoContext Switching

Puede utilizar la cláusula AS { LOGIN | USER } = ' name ' para cambiar el contexto de ejecución de una instrucción dinámica.You can use the AS { LOGIN | USER } = ' name ' clause to switch the execution context of a dynamic statement. 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.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.

Especificar un nombre de inicio de sesión o usuarioSpecifying a User or Login Name

El nombre de inicio de sesión o usuario especificado en AS { LOGIN | USER } = ' name ' debe existir como una entidad de seguridad en sys.database_principals o sys.server_principals respectivamente, o se producirá un error en la instrucción.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. Además, se deben conceder permisos IMPERSONATE en la entidad de seguridad.Additionally, IMPERSONATE permissions must be granted on the principal. A menos que el autor de la llamada sea el propietario de la base de datos o un miembro del rol fijo de servidor sysadmin, la entidad de seguridad debe existir aun cuando el usuario tenga acceso a la base de datos o una instancia de SQL ServerSQL Server mediante la pertenencia a un grupo de 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 ejemplo, supongamos las siguientes condiciones:For example, assume the following conditions:

  • El grupo CompanyDomain\SQLUsers tiene acceso a la base de datos Sales.CompanyDomain\SQLUsers group has access to the Sales database.

  • CompanyDomain\SqlUser1 es un miembro de SQLUsers y, por tanto, tiene acceso implícito a la base de datos Sales.CompanyDomain\SqlUser1 is a member of SQLUsers and, therefore, has implicit access to the Sales database.

    Aunque CompanyDomain\SqlUser1 tiene acceso a la base de datos a través de la pertenencia al grupo SQLUsers, se producirá un error en la instrucción EXECUTE @string_variable AS USER = 'CompanyDomain\SqlUser1' porque CompanyDomain\SqlUser1 no existe como una entidad de seguridad en la base de datos.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.

Procedimientos recomendadosBest Practices

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.Specify a login or user that has the least privileges required to perform the operations that are defined in the statement or module. Por ejemplo, no especifique un nombre de inicio de sesión que tiene permisos de nivel de servidor, si solo se necesitan permisos de nivel de base de datos; o no especifique una cuenta de propietario de base de datos a menos que se requieran esos permisos.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.

PermisosPermissions

No se requieren permisos para ejecutar la instrucción EXECUTE.Permissions are not required to run the EXECUTE statement. Sin embargo, se requieren permisos para los elementos protegibles a los que se hace referencia en la cadena EXECUTE.However, permissions are required on the securables that are referenced within the EXECUTE string. Por ejemplo, si la cadena contiene una instrucción INSERT, el autor de llamada de la instrucción EXECUTE debe tener el permiso INSERT en la tabla 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. Los permisos se comprueban cuando se encuentra la instrucción EXECUTE, incluso si la instrucción EXECUTE está incluida en un módulo.Permissions are checked at the time EXECUTE statement is encountered, even if the EXECUTE statement is included within a module.

Los permisos EXECUTE de un módulo son, de forma predeterminada, del propietario del módulo, que puede transferirlos a otros usuarios.EXECUTE permissions for a module default to the owner of the module, who can transfer them to other users. 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.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. No obstante, si el mismo usuario es propietario del módulo que llama y el módulo que se va a llamar, no se realiza la comprobación del permiso EXECUTE en el 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.

Si el módulo tiene acceso a otros objetos de base de datos, la ejecución es correcta cuando tienen el permiso EXECUTE en el módulo y una de las opciones siguientes es cierta:If the module accesses other database objects, execution succeeds when you have EXECUTE permission on the module and one of the following is true:

  • El módulo está marcado como EXECUTE AS USER o SELF y el propietario del módulo tiene los permisos correspondientes en el objeto referenciado.The module is marked EXECUTE AS USER or SELF, and the module owner has the corresponding permissions on the referenced object. Para más información sobre la suplantación dentro de un módulo, vea Cláusula EXECUTE AS (Transact-SQL).For more information about impersonation within a module, see EXECUTE AS Clause (Transact-SQL).

  • El módulo está marcado como EXECUTE AS CALLER y tiene los permisos correspondientes en el objeto.The module is marked EXECUTE AS CALLER, and you have the corresponding permissions on the object.

  • El módulo está marcado como EXECUTE AS user_name y user_name y tiene los permisos correspondientes en el objeto.The module is marked EXECUTE AS user_name, and user_name has the corresponding permissions on the object.

Permisos para cambiar de contextoContext Switching Permissions

Para especificar EXECUTE AS en un inicio de sesión, el autor de llamada debe tener permisos IMPERSONATE en el nombre de inicio de sesión especificado.To specify EXECUTE AS on a login, the caller must have IMPERSONATE permissions on the specified login name. Para especificar EXECUTE AS en un usuario de base de datos, el autor de llamada debe tener permisos IMPERSONATE en el nombre de usuario especificado.To specify EXECUTE AS on a database user, the caller must have IMPERSONATE permissions on the specified user name. Cuando no se especifica ningún contexto de ejecución o se especifica EXECUTE AS CALLER, no se requieren permisos IMPERSONATE.When no execution context is specified, or EXECUTE AS CALLER is specified, IMPERSONATE permissions are not required.

EjemplosExamples

A.A. Usar EXECUTE para pasar un único parámetroUsing EXECUTE to pass a single parameter

El procedimiento almacenado uspGetEmployeeManagers en la base de datos AdventureWorks2012AdventureWorks2012 espera un parámetro (@EmployeeID).The uspGetEmployeeManagers stored procedure in the AdventureWorks2012AdventureWorks2012 database expects one parameter (@EmployeeID). En el siguiente ejemplo se ejecuta el procedimiento almacenadouspGetEmployeeManagers con Employee ID 6 como valor del parámetro.The following examples execute the uspGetEmployeeManagers stored procedure with Employee ID 6 as its parameter value.

EXEC dbo.uspGetEmployeeManagers 6;  
GO  

La variable se puede llamar explícitamente en la ejecución:The variable can be explicitly named in the execution:

EXEC dbo.uspGetEmployeeManagers @EmployeeID = 6;  
GO  

Si la siguiente instrucción es la primera de un lote o de un script osql o sqlcmd, no se necesita EXEC.If the following is the first statement in a batch or an osql or sqlcmd script, EXEC is not required.

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

B.B. Usar varios parámetrosUsing multiple parameters

En el ejemplo siguiente se ejecuta el procedimiento almacenado spGetWhereUsedProductID en la base de datos AdventureWorks2012AdventureWorks2012.The following example executes the spGetWhereUsedProductID stored procedure in the AdventureWorks2012AdventureWorks2012 database. Pasa dos parámetros: el primero es el Id. de producto (819) y el segundo parámetro, @CheckDate,, es un 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. Usar EXECUTE 'tsql_string' con una variableUsing EXECUTE 'tsql_string' with a variable

En el ejemplo siguiente se muestra cómo trata EXECUTE las cadenas construidas dinámicamente que contienen variables.The following example shows how EXECUTE handles dynamically built strings that contain 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 AdventureWorks2012AdventureWorks2012 y, a continuación, usa esa lista para volver a generar todos los índices de las tablas.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. Usar EXECUTE con un procedimiento almacenado remotoUsing EXECUTE with a remote stored procedure

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.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.

Se aplica a: de SQL Server 2008SQL Server 2008 a SQL Server 2017SQL Server 2017Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017

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

E.E. Usar EXECUTE con una variable de procedimiento almacenadoUsing EXECUTE with a stored procedure variable

En el ejemplo siguiente se crea una variable que representa un nombre de procedimiento almacenado.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. Usar EXECUTE con DEFAULTUsing EXECUTE with DEFAULT

En el ejemplo siguiente se crea un procedimiento almacenado con valores predeterminados para el primer y tercer parámetro.The following example creates a stored procedure with default values for the first and third parameters. 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.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 las distintas formas en las que se puede usar la palabra clave DEFAULT.Note the various ways the DEFAULT keyword can be used.

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

El procedimiento almacenado Proc_Test_Defaults se puede ejecutar en muchas combinaciones.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. Usar EXECUTE con AT linked_server_nameUsing EXECUTE with AT linked_server_name

En el siguiente ejemplo se pasa una cadena de comandos a un servidor remoto.The following example passes a command string to a remote server. Crea un servidor vinculado SeattleSales que apunta a otra instancia de SQL ServerSQL Server y ejecuta una instrucción DDL (CREATE TABLE) contra ese 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.

Se aplica a: de SQL Server 2008SQL Server 2008 a SQL Server 2017SQL Server 2017Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017

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

H.H. Usar EXECUTE WITH RECOMPILEUsing 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.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. Usar EXECUTE con una función definida por el usuarioUsing EXECUTE with a user-defined function

En el siguiente ejemplo se ejecuta la función escalar definida por el usuario ufnGetSalesOrderStatusText en la base de datos AdventureWorks2012AdventureWorks2012.The following example executes the ufnGetSalesOrderStatusText scalar user-defined function in the AdventureWorks2012AdventureWorks2012 database. Usa la variable @returnstatus para almacenar el valor devuelto por la función.It uses the variable @returnstatus to store the value returned by the function. La función espera un parámetro de entrada, @Status.The function expects one input parameter, @Status. Se define como un tipo de datos 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. Usar EXECUTE para consultar una base de datos de Oracle en un servidor vinculadoUsing EXECUTE to query an Oracle database on a linked server

En el siguiente ejemplo se ejecutan varias instrucciones de SELECT en el servidor Oracle remoto.The following example executes several SELECT statements at the remote Oracle server. El ejemplo empieza agregando el servidor Oracle como un servidor vinculado y creando el inicio de sesión del servidor vinculado.The example begins by adding the Oracle server as a linked server and creating linked server login.

Se aplica a: de SQL Server 2008SQL Server 2008 a SQL Server 2017SQL Server 2017Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017

-- 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. Usar EXECUTE AS USER para cambiar el contexto a otro usuarioUsing EXECUTE AS USER to switch context to another user

En el siguiente ejemplo se ejecuta una cadena Transact-SQLTransact-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.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. El Motor de base de datosDatabase Engine comprobará los permisos de User1 cuando se ejecute la instrucción.The Motor de base de datosDatabase Engine will check the permissions of User1 when the statement is run. 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.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. Usar un parámetro con EXECUTE y AT linked_server_nameUsing a parameter with EXECUTE and 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.The following example passes a command string to a remote server by using a question mark (?) placeholder for a parameter. El ejemplo crea un servidor vinculado SeattleSales que apunta a otra instancia de SQL ServerSQL Server y ejecuta una instrucción SELECT en ese 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. 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.The SELECT statement uses the question mark as a place holder for the ProductID parameter (952), which is provided after the statement.

Se aplica a: de SQL Server 2008SQL Server 2008 a SQL Server 2017SQL Server 2017Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017

-- 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. Usar EXECUTE para volver a definir un conjunto de resultados únicoUsing EXECUTE to redefine a single result set

En algunos de los ejemplos anteriores se ejecutó EXEC dbo.uspGetEmployeeManagers 6;, que devolvió 7 columnas.Some of the previous examples executed EXEC dbo.uspGetEmployeeManagers 6; which returned 7 columns. 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.The following example demonstrates using the WITH RESULT SET syntax to change the names and data types of the returning result set.

Se aplica a: SQL Server 2012 (11.x)SQL Server 2012 (11.x) hasta SQL Server 2017SQL Server 2017, Base de datos SQL de AzureAzure SQL DatabaseApplies to: SQL Server 2012 (11.x)SQL Server 2012 (11.x) through SQL Server 2017SQL Server 2017, Base de datos SQL de 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. Usar EXECUTE para volver a definir dos conjuntos de resultadosUsing EXECUTE to redefine a two result sets

Al ejecutar una instrucción que devuelve más de un 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. En el siguiente ejemplo de AdventureWorks2012AdventureWorks2012 se crea un procedimiento que devuelve dos conjuntos de resultados.The following example in AdventureWorks2012AdventureWorks2012 creates a procedure that returns two result sets. Después, se ejecuta el procedimiento por medio de la cláusula WITH RESULT SETS y se especifican dos definiciones del conjunto de resultados.Then the procedure is executed using the WITH RESULT SETS clause, and specifying two result set definitions.

Se aplica a: SQL Server 2012 (11.x)SQL Server 2012 (11.x) hasta SQL Server 2017SQL Server 2017, Base de datos SQL de AzureAzure SQL DatabaseApplies to: SQL Server 2012 (11.x)SQL Server 2012 (11.x) through SQL Server 2017SQL Server 2017, Base de datos SQL de 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)  
);  

Ejemplos: Almacenamiento de datos SQL de AzureAzure SQL Data Warehouse y Almacenamiento de datos paralelosParallel Data WarehouseExamples: Almacenamiento de datos SQL de AzureAzure SQL Data Warehouse and Almacenamiento de datos paralelosParallel Data Warehouse

Ejemplo O: Ejecución de procedimiento básicaExample O: Basic Procedure Execution

Ejecutar un procedimiento almacenado:Executing a stored procedure:

EXEC proc1;  

Llamar a un procedimiento almacenado con un nombre determinado en tiempo de ejecución:Calling a stored procedure with name determined at runtime:

EXEC ('EXEC ' + @var);  

Llamar a un procedimiento almacenado desde un procedimiento almacenado:Calling a stored procedure from within a stored procedure:

CREATE sp_first AS EXEC sp_second; EXEC sp_third;  

Ejemplo P: Ejecutar cadenasExample P: Executing Strings

Ejecutar una cadena SQL:Executing a SQL string:

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

Ejecutar una cadena anidada:Executing a nested string:

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

Ejecutar una variable de cadena:Executing a string variable:

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

Ejemplo Q : Procedimientos con parámetrosExample Q: Procedures with Parameters

En el siguiente ejemplo se crea un procedimiento con parámetros y se muestran tres formas de ejecutarlo: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  

Ver tambiénSee Also

@@NESTLEVEL (Transact-SQL) @@NESTLEVEL (Transact-SQL)
DECLARE @local_variable (Transact-SQL) DECLARE @local_variable (Transact-SQL)
EXECUTE AS (cláusula de Transact-SQL) EXECUTE AS Clause (Transact-SQL)
osql Utility (Utilidad osql)osql Utility
Entidades de seguridad (motor de base de datos) Principals (Database Engine)
REVERT (Transact-SQL) REVERT (Transact-SQL)
sp_addlinkedserver (Transact-SQL) sp_addlinkedserver (Transact-SQL)
sqlcmd (utilidad) 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)
Funciones escalares definidas por el usuario para OLTP en memoriaScalar User-Defined Functions for In-Memory OLTP