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.

Nota de seguridadNota 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 AdventureWorks2008R2.Production.Product 
WHERE ProductSubcategoryID = 1;

SELECT * 
FROM AdventureWorks2008R2.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 es reconocer siempre que las instrucciones generan básicamente 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 AdventureWorks2008R2.Production.Product 
      WHERE ProductSubcategoryID = @Parm',
      N'@Parm INT',
      @MyIntParm
    

    Este método se recomienda para las scripts 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ámetro 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 AdventureWorks2008R2.Production.Product 
        WHERE ProductSubcategoryID = ?",
        SQL_NTS);
      

      El proveedor OLE DB de SQL Server Native Client y el controlador ODBC de SQL Server Native Client que se incluyen en SQL Server, utilizan sp_executesql para enviar instrucciones a SQL Server 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:

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.