Parametri e riutilizzo del piano di esecuzione

L'utilizzo dei parametri, inclusi gli indicatori di parametro nelle applicazioni ADO, OLE DB e ODBC, può comportare un maggiore riutilizzo dei piani di esecuzione.

Nota sulla protezioneNota sulla protezione

L'utilizzo di parametri o indicatori di parametro per includere i valori digitati dagli utenti offre una protezione maggiore rispetto al concatenamento dei valori in una stringa eseguita utilizzando un metodo API di accesso ai dati, l'istruzione EXECUTE o la stored procedure sp_executesql.

L'unica differenza tra le due istruzioni SELECT seguenti è rappresentata dai valori confrontati nella clausola WHERE:

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

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

L'unica differenza tra i piani di esecuzione delle due query è rappresentata dal valore archiviato per il confronto con la colonna ProductSubcategoryID. L'obiettivo principale di SQL Server consiste nel riconoscere sempre che le istruzioni generano essenzialmente lo stesso piano e nel riutilizzare i piani, benché ciò non sempre avvenga per istruzioni SQL complesse.

La separazione delle costanti dall'istruzione SQL tramite i parametri consente al motore relazionale di riconoscere i piani duplicati. È possibile utilizzare i parametri come indicato di seguito:

  • In Transact-SQL, utilizzare sp_executesql:

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

    Questo metodo è particolarmente adatto per gli script, le stored procedure o i trigger Transact-SQL che generano istruzioni SQL in modo dinamico.

  • ADO, OLE DB e ODBC utilizzano gli indicatori di parametro. Gli indicatori di parametro sono punti interrogativi (?) che sostituiscono una costante in un'istruzione SQL e sono associati a una variabile di programma. In un'applicazione ODBC, ad esempio, verrebbero eseguite le operazioni seguenti:

    • Utilizzare SQLBindParameter per associare una variabile integer al primo indicatore di parametro di un'istruzione SQL.

    • Inserire il valore integer nella variabile.

    • Eseguire l'istruzione specificando l'indicatore di parametro (?):

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

      Il provider OLE DB di SQL Server Native Client e il driver ODBC di SQL Server Native Client inclusi in SQL Server utilizzano sp_executesql per inviare istruzioni a SQL Server quando nelle applicazioni vengono utilizzati indicatori di parametro.

  • Progettare stored procedure, che utilizzano parametri per schema.

Se non si creano parametri in modo esplicito nella progettazione dell'applicazione, è inoltre possibile basarsi su SQL Server Query Optimizer per parametrizzare automaticamente query specifiche utilizzando il funzionamento predefinito di Parametrizzazione semplice. In alternativa, è possibile forzare Query Optimizer affinché esegua la parametrizzazione di tutte le query nel database impostando su FORCED l'opzione PARAMETERIZATION dell'istruzione ALTER DATABASE. Per ulteriori informazioni, vedere Parametrizzazione forzata.

Quando viene attivata la parametrizzazione forzata, la parametrizzazione semplice può essere comunque eseguita. La query seguente, ad esempio, non può essere parametrizzata in base alle regole di parametrizzazione forzata:

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

La query può tuttavia essere parametrizzata in base alle regole di parametrizzazione semplice. Quando un tentativo di parametrizzazione forzata ha esito negativo, viene successivamente tentata la parametrizzazione semplice.