Sdílet prostřednictvím


Vytvoření průvodce plánem pro parametrizované dotazy

platí pro:SQL ServerAzure SQL Databaseazure SQL Managed Instance

Průvodce plánem šablony odpovídá samostatným dotazům, které se parametrizují do specifikovaného tvaru.

Následující příklad vytvoří průvodce plánem, který odpovídá jakémukoli dotazu, který parametrizuje zadaný formulář, a směruje SQL Server k vynucení parametrizace dotazu. Následující dva dotazy jsou syntakticky ekvivalentní, ale liší se pouze v jejich konstantních literálových hodnotách.

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

Tady je průvodce plánem parametrizované formy dotazu:

EXEC sp_create_plan_guide   
    @name = N'TemplateGuide1',  
    @stmt = N'SELECT * FROM AdventureWorks2022.Sales.SalesOrderHeader AS h  
              INNER JOIN AdventureWorks2022.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)';  

V předchozím příkladu je hodnota parametru @stmt parametrem parametrizovaná forma dotazu. Jediným spolehlivým způsobem, jak tuto hodnotu získat pro použití v sp_create_plan_guide, je použít uloženou proceduru sp_get_query_template systému. Následující skript lze použít jak k získání parametrizovaného dotazu, tak k vytvoření průvodce plánem.

DECLARE @stmt nvarchar(max);  
DECLARE @params nvarchar(max);  
EXEC sp_get_query_template   
    N'SELECT * FROM AdventureWorks2022.Sales.SalesOrderHeader AS h  
      INNER JOIN AdventureWorks2022.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)';  

Důležitý

Hodnota konstantních literálů v parametru @stmt předaného sp_get_query_template může ovlivnit datový typ zvolený pro parametr, který nahradí literál. To ovlivní sladění pokynů plánu. Možná budete muset vytvořit více než jednoho průvodce plánem pro zpracování různých rozsahů hodnot parametrů.

Můžete také použít průvodce plány ŠABLON společně s průvodci plány SQL. Můžete například vytvořit šablonu průvodce plánem, abyste měli jistotu, že je třída dotazů parametrizovaná. Pak můžete vytvořit průvodce plánem SQL v parametrizované podobě tohoto dotazu.