Creare una guida di piano per le query con parametriCreate a Plan Guide for Parameterized Queries

Una guida di piano di tipo TEMPLATE corrisponde alle query autonome con parametrizzazioni specifiche.A TEMPLATE plan guide matches stand-alone queries that parameterize to a specified form.

Nel seguente esempio viene creata una guida di piano corrispondente a qualsiasi query che parametrizza un formato specifico e forza in SQL ServerSQL Server l'esecuzione della parametrizzazione della query.The following example creates a plan guide that matches any query that parameterizes to a specified form, and directs SQL ServerSQL Server to force parameterization of the query. Le due query seguenti sono equivalenti a livello sintattico. L'unica differenza risiede nei relativi valori letterali costanti.The following two queries are syntactically equivalent, but differ only in their constant literal values.

SELECT * FROM AdventureWorks2012.Sales.SalesOrderHeader AS h  
INNER JOIN AdventureWorks2012.Sales.SalesOrderDetail AS d   
    ON h.SalesOrderID = d.SalesOrderID  
WHERE h.SalesOrderID = 45639;  

SELECT * FROM AdventureWorks2012.Sales.SalesOrderHeader AS h  
INNER JOIN AdventureWorks2012.Sales.SalesOrderDetail AS d   
    ON h.SalesOrderID = d.SalesOrderID  
WHERE h.SalesOrderID = 45640;  

Di seguito è riportata la guida di piano nel formato con parametri della query:Here is the plan guide on the parameterized form of the query:

EXEC sp_create_plan_guide   
    @name = N'TemplateGuide1',  
    @stmt = N'SELECT * FROM AdventureWorks2012.Sales.SalesOrderHeader AS h  
              INNER JOIN AdventureWorks2012.Sales.SalesOrderDetail AS d   
                  ON h.SalesOrderID = d.SalesOrderID  
              WHERE h.SalesOrderID = @0',  
    @type = N'TEMPLATE',  
    @module_or_batch = NULL,  
    @params = N'@0 int',  
    @hints = N'OPTION(PARAMETERIZATION FORCED)';  

Nell'esempio precedente il valore del parametro @stmt corrisponde al formato con parametri della query.In the previous example, the value for the @stmt parameter is the parameterized form of the query. L'unico modo affidabile per ottenere questo valore da usare in sp_create_plan_guide è usare la stored procedure di sistema sp_get_query_template .The only reliable way to obtain this value for use in sp_create_plan_guide is to use the sp_get_query_template system stored procedure. Lo script seguente può essere utilizzato sia per ottenere la query con parametri che per creare una guida di piano in base a essa.The following script can be used both to obtain the parameterized query and then create a plan guide on it.

DECLARE @stmt nvarchar(max);  
DECLARE @params nvarchar(max);  
EXEC sp_get_query_template   
    N'SELECT * FROM AdventureWorks2012.Sales.SalesOrderHeader AS h  
      INNER JOIN AdventureWorks2012.Sales.SalesOrderDetail AS d   
          ON h.SalesOrderID = d.SalesOrderID  
      WHERE h.SalesOrderID = 45639;',  
    @stmt OUTPUT,   
    @params OUTPUT  
EXEC sp_create_plan_guide N'TemplateGuide1',   
    @stmt,   
    N'TEMPLATE',   
    NULL,   
    @params,   
    N'OPTION(PARAMETERIZATION FORCED)';  
Importante

Il valore letterale costante nel parametro @stmt passato a sp_get_query_template potrebbe interessare il tipo di dati scelto per il parametro che sostituisce il valore letterale.The value of the constant literals in the @stmt parameter passed to sp_get_query_template might affect the data type that is chosen for the parameter that replaces the literal. Ciò potrebbe avere ripercussioni sulla corrispondenza eseguita in base alla guida di piano.This will affect plan guide matching. Potrebbe essere necessario creare più guide di piano per gestire intervalli di valori dei parametri diversi.You may have to create more than one plan guide to handle different parameter value ranges.

Le guide di piano di tipo TEMPLATE possono essere utilizzate con le guide di piano di tipo SQL.You can also use TEMPLATE plan guides together with SQL plan guides. Ad esempio, è possibile creare una guida di piano di tipo TEMPLATE per assicurarsi che una classe di query venga sottoposta a parametrizzazioneFor example, you can create a TEMPLATE plan guide to make sure that a class of queries is parameterized. È possibile creare una guida di piano di tipo SQL sulla query con parametri.You can then create an SQL plan guide on the parameterized form of that query.