Share via


Parámetros y reutilización de un plan de ejecución

El uso de parámetros, incluidos los marcadores de parámetros de las aplicaciones ADO, OLE DB y ODBC, puede incrementar las posibilidades de volver a utilizar los planes de ejecución.

ms175580.security(es-es,SQL.90).gifNota de seguridad:
La utilización de parámetros o marcadores de parámetros para contener valores que especifican los usuarios finales es más segura que la concatenación de valores en una cadena que después se ejecuta mediante un método de API de acceso de datos, la instrucción EXECUTE o el procedimiento almacenado sp_executesql.

La única diferencia entre las dos instrucciones SELECT siguientes son los valores que se comparan en la cláusula WHERE:

SELECT * FROM AdventureWorks.Production.Product WHERE ProductSubcategoryID = 1

SELECT * FROM AdventureWorks.Production.Product WHERE ProductSubcategoryID= 4

La única diferencia entre los planes de ejecución para estas consultas es el valor que se almacena para la comparación con la columna ProductSubcategoryID. Aunque el objetivo de SQL Server 2005 es reconocer siempre que las instrucciones generan en esencia el mismo plan y volver a utilizar los planes, SQL Server no siempre lo detecta en las instrucciones SQL complejas.

Separar las constantes de la instrucción SQL mediante parámetros ayuda al motor relacional a reconocer los planes duplicados. Puede utilizar los parámetros de varias maneras:

  • En Transact-SQL, utilice sp_executesql:

    DECLARE @MyIntParm INT
    SET @MyIntParm = 1
    EXEC sp_executesql
      N'SELECT * FROM AdventureWorks.Production.Product WHERE ProductSubcategoryID = @Parm',
      N'@Parm INT',
      @MyIntParm
    

    Este método se recomienda para las secuencias de comandos Transact-SQL, procedimientos almacenados o desencadenadores que generan dinámicamente instrucciones SQL.

  • Con ADO, OLE DB y ODBC, utilice marcadores de parámetros. Los marcadores de parámetros son signos de interrogación (?) que sustituyen a una constante en una instrucción SQL y se enlazan a una variable de programa. Por ejemplo, podría hacer lo siguiente en una aplicación ODBC:

    • Utilice SQLBindParameter para enlazar una variable de tipo entero al primer marcador de parámetros en una instrucción SQL.

    • Coloque el valor entero en la variable.

    • Ejecute la instrucción y especifique el marcador de parámetros (?):

      SQLExecDirect(hstmt, 
        "SELECT * FROM AdventureWorks.Production.Product WHERE ProductSubcategoryID = ?",
        SQL_NTS);
      

      El proveedor OLE DB de SQL Native Client y el controlador ODBC de SQL Native Client que se incluyen en SQL Server 2005 utilizan sp_executesql para enviar instrucciones a SQL Server 2005 cuando se usan marcadores de parámetros en las aplicaciones.

  • Para diseñar procedimientos almacenados, que utilizan parámetros por diseño.

Si no incorpora explícitamente parámetros en el diseño de las aplicaciones, puede utilizar el optimizador de consultas de SQL Server para parametrizar automáticamente determinadas consultas mediante el uso del comportamiento predeterminado de Parametrización simple. O bien, puede forzar que el optimizador de consultas tenga en cuenta la parametrización de todas las consultas de la base de datos si establece la opción PARAMETERIZATION de la instrucción ALTER DATABASE en FORCED. Para obtener más información, vea Parametrizaciones forzadas.

Cuando se habilita la parametrización forzada, se puede producir la parametrización simple. Por ejemplo, la siguiente consulta no se puede parametrizar según las reglas de parametrización forzada de SQL Server 2005:

SELECT * FROM Person.Address
WHERE AddressID = 1 + 2

Sin embargo, se puede parametrizar según las reglas de parametrización simple. Cuando la parametrización forzada se intenta pero falla, después se sigue intentando la parametrización simple.

Vea también

Referencia

SQL Statistics (objeto de SQL Server)

Otros recursos

sp_executesql (Transact-SQL)
Command Parameters
Using Statement Parameters

Ayuda e información

Obtener ayuda sobre SQL Server 2005