Preparar comandos
Se aplica a: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)
El controlador OLE DB para SQL Server admite la preparación de comandos para la ejecución múltiple y optimizada de un único comando; en cambio, la preparación de comandos genera una sobrecarga y no es necesario que un consumidor prepare un comando para ejecutarlo más de una vez. En general, un comando debería prepararse si va a ejecutarse más de tres veces.
Por razones de rendimiento, la preparación del comando se difiere hasta que se ejecuta el comando. Este es el comportamiento predeterminado. Cualquier error que se produzca en el comando que se está preparando no se dará a conocer hasta que el comando se ejecute o hasta que se realice una operación de metapropiedad. Establecer la propiedad SSPROP_DEFERPREPARE de SQL Server en FALSE puede desactivar este comportamiento predeterminado.
En SQL Server, cuando un comando se ejecuta directamente (sin prepararlo antes), se crea un plan de ejecución y se almacena en la memoria caché. Si vuelve a ejecutarse la instrucción SQL, SQL Server dispone de un algoritmo eficaz para hacer coincidir la nueva instrucción con el plan de ejecución existente en la memoria caché, y reutiliza el plan de ejecución para esa instrucción.
En el caso de los comandos preparados, SQL Server proporciona compatibilidad nativa para preparar y ejecutar instrucciones de comandos. Cuando se prepara una instrucción, SQL Server crea un plan de ejecución, lo almacena en la memoria caché y devuelve un identificador a este plan de ejecución al proveedor. A continuación, el proveedor utiliza este identificador para ejecutar repetidamente la instrucción. No se crea ningún procedimiento almacenado. Dado que el identificador identifica directamente el plan de ejecución de una instrucción SQL en lugar de hacer coincidir la instrucción con el plan de ejecución de la memoria caché (como ocurre con la ejecución directa), resulta más eficaz preparar una instrucción que ejecutarla directamente, si sabe que la instrucción se ejecutará bastantes veces.
En SQL Server 2005 (9.x), las instrucciones preparadas no pueden utilizarse para crear objetos temporales ni pueden hacer referencia a procedimientos almacenados del sistema que crean objetos temporales, como tablas temporales. Estos procedimientos deben ejecutarse directamente.
Algunos comandos no deberían prepararse nunca. Por ejemplo, no deberían prepararse nunca los comandos que especifican la ejecución de procedimientos almacenados o los comandos que incluyen texto que no es válido para la creación de procedimientos almacenados de SQL Server.
Si se crea un procedimiento almacenado temporal, el controlador OLE DB para SQL Server lo ejecuta y devuelve los resultados como si se hubiera ejecutado la propia instrucción.
La propiedad de inicialización SSPROP_INIT_USEPROCFORPREP específica del controlador OLE DB para SQL Server controla la creación del procedimiento almacenado temporal. Si el valor de la propiedad es SSPROPVAL_USEPROCFORPREP_ON o SSPROPVAL_USEPROCFORPREP_ON_DROP, el controlador OLE DB para SQL Server intenta crear un procedimiento almacenado cuando se prepara un comando. La creación del procedimiento almacenado se realiza correctamente si el usuario de la aplicación tiene suficientes permisos de SQL Server.
En el caso de los consumidores que se desconectan con poca frecuencia, la creación de procedimientos almacenados temporales puede requerir recursos significativos de tempdb, la base de datos del sistema de SQL Server en la que se crean los objetos temporales. Si el valor de SSPROP_INIT_USEPROCFORPREP es SSPROPVAL_USEPROCFORPREP_ON, los procedimientos almacenados temporales creados por el controlador OLE DB para SQL Server solo se quitan cuando la sesión que ha creado el comando pierde su conexión con la instancia de SQL Server. Si esa conexión es la conexión predeterminada creada durante la inicialización del origen de datos, el procedimiento almacenado temporal solamente se quita cuando se cancela la inicialización del origen de datos.
Si el valor de SSPROP_INIT_USEPROCFORPREP es SSPROPVAL_USEPROCFORPREP_ON_DROP, los procedimientos almacenados temporales del controlador OLE DB para SQL Server se quitan cuando se produce una de estas situaciones:
El consumidor usa ICommandText::SetCommandText para indicar un nuevo comando.
El consumidor usa ICommandPrepare::Unprepare para indicar que ya no requiere el texto del comando.
El consumidor libera todas las referencias al objeto de comando utilizando el procedimiento almacenado temporal.
Un objeto de comando tiene a lo sumo un procedimiento almacenado temporal en tempdb. Cualquier procedimiento almacenado temporal existente representa el texto de comando actual de un objeto de comando concreto.