EXECUTE (Transact-SQL)

Actualizado: 15 de septiembre de 2007

Ejecuta una cadena de comandos o una cadena de caracteres dentro de un proceso por lotes de Transact-SQL, o uno de los siguientes módulos: procedimiento almacenado del sistema, procedimiento almacenado definido por el usuario, función con valores escalares definida por el usuario o procedimiento almacenado extendido.

ms188332.security(es-es,SQL.90).gifNota de seguridad:
Antes de llamar a EXECUTE con una cadena de caracteres, valide la cadena de caracteres. Nunca ejecute un comando construido desde la entrada de usuario que no se haya validado. Para obtener más información, vea Inyección de código SQL.

SQL Server 2005 amplía la instrucción EXECUTE para que se pueda usar para enviar comandos de paso a través a servidores vinculados. Además, el contexto en el que se ejecuta una cadena o un comando se puede establecer de forma explícita.

Icono de vínculo a temasConvenciones de sintaxis de Transact-SQL

Sintaxis

Execute a stored procedure or function
[ { EXEC | EXECUTE } ]
    { 
      [ @return_status = ]
      { module_name [ ;number ] | @module_name_var } 
        [ [ @parameter = ] { value 
                           | @variable [ OUTPUT ] 
                           | [ DEFAULT ] 
                           }
        ]
      [ ,...n ]
      [ WITH RECOMPILE ]
    }
[;]

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

Argumentos

  • **@**return_status
    Es una variable entera opcional que almacena el estado de retorno de un módulo. 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.

    Cuando se utiliza para llamar a una función con valores escalares definida por el usuario, la variable **@**return_status puede ser de cualquier tipo de datos escalar.

  • module_name
    Es el nombre, completo o no, del procedimiento almacenado o la función con valores escalares definida por el usuario a la que debe llamar. Los nombres de módulo deben cumplir las mismas reglas que 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 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. 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, SQL Server 2005 Database Engine (Motor de base de datos de SQL Server 2005) busca el módulo en la base de datos predeterminada del usuario.

  • **;**number
    Es un entero opcional que se utiliza para agrupar procedimientos que tengan el mismo nombre. Este parámetro no se utiliza para los procedimientos almacenados extendidos.

    [!NOTA] Esta característica se quitará en una versión futura de Microsoft 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 acerca de los grupos de procedimientos, vea CREATE PROCEDURE (Transact-SQL).

  • **@**module_name_var
    Es el nombre de la variable definida localmente, que representa el nombre de un módulo.
  • @parameter
    Es el parámetro de module_name, como se define en el módulo. Los nombres de parámetro deben precederse del signo (
    @
    ). Cuando se utilice con la forma **@**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. No obstante, si se usa la forma **@**parameter_name=value en un parámetro, debe utilizarse en todos los parámetros siguientes.

    De manera predeterminada, los parámetros admiten valores NULL. Si se pasa un valor NULL a un parámetro y se utiliza en una instrucción CREATE TABLE o ALTER TABLE en la que la columna a la que se hace referencia no admite permite valores NULL (por ejemplo, insertar en una columna que no permite valores NULL), Database Engine (Motor de base de datos) generará un error. Para impedir que se pase un valor de parámetro NULL a una columna que no permite valores NULL, agregue lógica de programación al módulo o utilice un valor predeterminado (con la palabra clave DEFAULT de CREATE TABLE o ALTER TABLE) para la columna.

  • value
    Es el valor del parámetro que se va a pasar al módulo o a un comando de paso a través. Si no se especifican los nombres de los parámetros, sus valores 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 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 puede ser también NULL. Generalmente, la definición del módulo especifica la acción que debe realizarse si el valor del parámetro es NULL.

  • **@**variable
    Es la 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 del módulo o de la cadena de comandos debe haberse creado también con la palabra clave OUTPUT. Utilice esta palabra clave cuando use variables de cursor como parámetros.

    Si value está definido como OUTPUT de un módulo ejecutado contra un servidor vinculado, los cambios en el **@**parameter correspondiente realizados por el proveedor OLE DB se copiarán de vuelta a la variable al finalizar la ejecución del módulo.

    Si se están utilizando parámetros OUTPUT y la intención es usar los valores devueltos en otras instrucciones del proceso por lotes o módulo que realiza la llamada, el valor del parámetro debe pasarse como una variable, por ejemplo, **@**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. Las constantes no se pueden pasar al módulo mediante OUTPUT; el parámetro devuelto 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 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).

    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, o bien falta el parámetro o se especifica la palabra clave DEFAULT, se produce un error.
  • WITH RECOMPILE
    Exige que un nuevo plan se compile, se use y se descarte después de ejecutar el módulo. Si hay algún plan de consulta existente para el módulo, este plan permanece en la caché.

    Utilice esta opción si el parámetro que está proporcionando es atípico o si los datos han cambiado de forma significativa. Esta opción no se utiliza para los procedimientos almacenados extendidos. Se recomienda que use esta opción con cautela, porque es costosa.

    [!NOTA] No puede utilizar WITH RECOMPILE al llamar a un procedimiento almacenado que utiliza la sintaxis de OPENDATASOURCE. Se omite la opción WITH RECOMPILE cuando se especifica un nombre de objeto de cuatro partes.

  • **@**string_variable
    Es el nombre de una variable local. **@**string_variable puede ser cualquier tipo de datos char, varchar, nchar o nvarchar. Incluye los tipos de datos (max).
  • [N] 'tsql_string'
    Es una cadena de constante. tsql_string puede ser del tipo de datos nvarchar o varchar. Si se incluye N, la cadena se interpreta como del tipo de datos nvarchar.
  • 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 en el nivel de servidor de ese usuario.

    ms188332.note(es-es,SQL.90).gifImportante:
    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. Esto incluye instrucciones USE database, consultas distribuidas y consultas que hacen referencia a otra base de datos que usan identificadores de tres o cuatro partes. Para extender el ámbito del cambio de contexto fuera de la base de datos actual, vea Extender la suplantación de la base de datos mediante EXECUTE AS.
  • 'name'
    Es un inicio de sesión o usuario válido. name debe ser miembro de la función fija de servidor sysadmin o existir como entidad de seguridad en sys.database_principals o sys.server_principals, respectivamente.

    name 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 inicio de sesión o usuario más adelante en este tema.

  • [N] 'command_string'
    Es una cadena constante que contiene el comando que se va a pasar a través al servidor vinculado. Si se incluye N, la cadena se interpreta como del tipo de datos nvarchar.
  • [?]
    Indica los parámetros, para los que se suministran valores en <arg-list> de comandos de paso a través que se utilizan en una instrucción EXEC('…', <arg-list>) AT <linkedsrv>.
  • AT linked_server_name
    Especifica que command_string se ejecuta contra linked_server_name y el resultad, si existe, se devuelve al cliente. linked_server_name debe hacer referencia a la definición de un servidor vinculado existente en el servidor local. Los servidores vinculados se definen con sp_addlinkedserver.

Notas

Los parámetros se pueden proporcionar mediante value o **@parameter_name=**value. Un parámetro no es parte de una transacción; por tanto, si un parámetro se cambia en una transacción que posteriormente se revierte, 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 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. Si se excede el máximo de 32 niveles de anidamiento, habrá un error de la cadena completa de llamada. El nivel actual de anidamiento se almacena en la función del sistema @@NESTLEVEL.

Debido a que ni los procedimientos almacenados ni los procedimientos almacenados extendidos se encuentran dentro del alcance 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. Para obtener más información, vea Procedimientos almacenados del sistema (Transact-SQL) y 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.

Cuando ejecute módulos, no es necesario que especifique la palabra clave EXECUTE si la instrucción es la primera de un proceso por lotes.

Usar EXECUTE con procedimientos almacenados

Cuando ejecute procedimientos almacenados, no es necesario que especifique la palabra clave EXECUTE cuando la instrucción es la primera de un proceso por lotes.

Los procedimientos almacenados del sistema de SQL Server empiezan con los caracteres sp_. Se almacenan físicamente en la base de datos Resource, pero aparecen lógicamente en el esquema sys de cada sistema y base de datos definida por el usuario. Cuando ejecuta un procedimiento almacenado del sistema, ya sea en un proceso por lotes o en un módulo como un procedimiento almacenado definido por el usuario o una función, se recomienda que califique el nombre del procedimiento almacenado con el nombre del esquema sys.

Los procedimientos almacenados extendidos del sistema de SQL Server empiezan con los caracteres xp_, y se encuentran en el esquema dbo de la base de datos master. Cuando ejecuta un procedimiento almacenado extendido del sistema, ya sea en un proceso por lotes o en un módulo como un procedimiento almacenado definido por el usuario o una función, se recomienda que califique el nombre del procedimiento almacenado con master.dbo.

Cuando ejecuta un procedimiento almacenado definido por el usuario, ya sea en un proceso por lotes o en un módulo como un procedimiento almacenado definido por el usuario o una función, se recomienda que califique el nombre del procedimiento almacenado con un nombre de esquema. No se recomienda que denomine al procedimiento almacenado definido por el usuario con el mismo nombre que un procedimiento almacenado del sistema. Para obtener más información acerca de cómo ejecutar procedimientos almacenados, vea Ejecutar procedimientos almacenados (motor de base de datos).

Utilizar EXECUTE con una cadena de caracteres

En versiones anteriores de SQL Server, las cadenas de caracteres se limitaban a 8.000 bytes. Esto requería la concatenación de grandes cadenas para la ejecución dinámica. En SQL Server 2005, 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 sólo duran hasta el final de la instrucción EXECUTE. Por ejemplo, después de ejecutar EXEC en esta instrucción, el contexto de base de datos es master.

USE master; EXEC ('USE AdventureWorks; SELECT EmployeeID, Title 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. Para obtener más información, vea Descripción del cambio de contexto.

Especificar un nombre de inicio de sesión o usuario

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 la instrucción generará errores. Además, se deben conceder permisos IMPERSONATE en la entidad de seguridad. A menos que el llamador sea el propietario de la base de datos o sea un miembro de la función fija de servidor sysadmin, la entidad de seguridad debe existir aun cuando el usuario tenga acceso a la base de datos o instancia de SQL Server mediante la pertenencia a un grupo de Windows. Por ejemplo, supongamos las siguientes condiciones:

  • El grupo CompanyDomain\SQLUsers tiene acceso a la base de datos Sales.
  • CompanyDomain\SqlUser1 es un miembro de SQLUsers y, por tanto, tiene acceso implícito a la base de datos Sales.

Aunque CompanyDomain\SqlUser1 tiene acceso a la base de datos a través de la pertenencia el grupo SQLUsers, la instrucción EXECUTE @string_variable AS USER = 'CompanyDomain\SqlUser1' generará errores porque CompanyDomain\SqlUser1 no existe como una entidad de seguridad en la base de datos.

Práctica recomendada

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 tiene permisos en el nivel de servidor, si sólo se necesitan permisos en el nivel de base de datos; o no especifique una cuenta de propietario de base de datos a menos que se requieran esos permisos.

Permisos

No se requieren permisos para ejecutar la instrucción EXECUTE. Sin embargo, se requieren permisos en los asegurables a los que se hace referencia en la cadena EXECUTE. Por ejemplo, si la cadena contiene una instrucción INSERT, el llamador de la instrucción EXECUTE debe tener el permiso INSERT en la tabla de destino. Los permisos se comprueban cuando se encuentra la instrucción EXECUTE, incluso si la instrucción EXECUTE está incluida en un módulo.

Los permisos EXECUTE de un módulo son, de forma predeterminada, del 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. 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. Para obtener más información, vea Cadenas de propiedad.

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:

  • 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.
  • El módulo está marcado como EXECUTE AS CALLER y tiene los permisos correspondientes en el objeto.
  • El módulo está marcado como EXECUTE AS user_name y user_name y tiene los permisos correspondientes en el objeto.

Permisos para cambiar de contexto

Para especificar EXECUTE AS en un inicio de sesión, el llamador debe tener permisos IMPERSONATE en el nombre de inicio de sesión especificado. Para especificar EXECUTE AS en un usuario de base de datos, el llamador 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 permisos IMPERSONATE.

Ejemplos

A. Usar EXECUTE para pasar un único parámetro

El procedimiento almacenado uspGetEmployeeManagers espera un parámetro (@EmployeeID). En el siguiente ejemplo se ejecuta el procedimiento almacenado uspGetEmployeeManagers con Employee ID 6 como valor del parámetro.

USE AdventureWorks;
GO
EXEC dbo.uspGetEmployeeManagers 6;
GO

La variable se puede llamar explícitamente en la ejecución:

EXEC dbo.uspGetEmployeeManagers @EmployeeID = 6;
GO

Si la siguiente instrucción es la primera en un proceso por lotes o en una secuencia de comandos osql o sqlcmd, no se requiere EXEC.

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

B. Usar varios parámetros

En el ejemplo siguiente se ejecuta el procedimiento almacenado spGetWhereUsedProductID. Pasa dos parámetros: el primero es el Id. de un producto (819) y el segundo parámetro, @CheckDate,, es un valor datetime.

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

C. Usar EXECUTE 'tsql_string' con una variable

En el ejemplo siguiente se muestra cómo administra 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 AdventureWorks y, a continuación, usa esa lista para volver a generar todos los índices de las tablas.

USE AdventureWorks;
GO
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;
   EXEC ('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. Usar 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 int;
EXECUTE @retstat = SQLSERVER1.AdventureWorks.dbo.uspGetEmployeeManagers @EmployeeID = 6;

F. Usar 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 varchar(30);
SET @proc_name = 'sys.sp_who';
EXEC @proc_name;

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

USE AdventureWorks;
GO
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. Usar 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.

EXEC sp_addlinkedserver 'SeattleSales', 'SQL Server'
GO
EXECUTE ( 'CREATE TABLE AdventureWorks.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. Usar EXECUTE con una función definida por el usuario

En el siguiente ejemplo se ejecuta la función con valores escalares definida por el usuario ufnGetSalesOrderStatusText. 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.

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

J. Usar 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.
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. 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 llamador a User1. Database Engine (Motor de base de datos) comprobará los permisos de User1 cuando se ejecute 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 o la instrucción generará errores.

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

L. Utilizar 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.
EXEC sp_addlinkedserver 'SeattleSales', 'SQL Server'
GO
-- Execute the SELECT statement.
EXECUTE ('SELECT ProductID, Name 
    FROM AdventureWorks.Production.Product
    WHERE ProductID = ? ', 952) AT SeattleSales;
GO

Vea también

Referencia

@@NESTLEVEL (Transact-SQL)
DECLARE @local\_variable (Transact-SQL)
EXECUTE AS (cláusula de Transact-SQL)
REVERT (Transact-SQL)
sp_addlinkedserver (Transact-SQL)
SUSER_NAME (Transact-SQL)
sys.database_principals (Transact-SQL)
sys.server_principals (Transact-SQL)
USER_NAME (Transact-SQL)
OPENDATASOURCE (Transact-SQL)

Otros recursos

osql (utilidad)
Entidades de seguridad
sqlcmd (utilidad)
Descripción del contexto de ejecución
Descripción del cambio de contexto

Ayuda e información

Obtener ayuda sobre SQL Server 2005

Historial de cambios

Versión Historial

15 de septiembre de 2007

Contenido nuevo:
  • Se agregó información sobre cómo utilizar la opción WITH RECOMPILE con procedimientos almacenados que utilizan la sintaxis de OPENDATASOURCE.

14 de abril de 2006

Contenido nuevo:
  • Se ha agregado el argumento [?] y su descripción.
  • Se ha agregado el ejemplo L.