Dela via


Skapa en planguide för parametriserade frågor

gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

En mallplansguide matchar fristående frågor som parameteriseras till ett angivet formulär.

I följande exempel skapas en planguide som matchar alla frågor som parameteriseras till ett angivet formulär och som dirigerar SQL Server till att framtvinga parameterisering av frågan. Följande två frågor är syntaktiskt likvärdiga, men skiljer sig bara åt i sina konstanta literalvärden.

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;  

Här är planguiden för frågans parametriserade form:

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)';  

I föregående exempel är värdet för parametern @stmt den parametriserade formen av frågan. Det enda tillförlitliga sättet att få det här värdet för användning i sp_create_plan_guide är att använda den sp_get_query_template system lagrade proceduren. Följande skript kan användas både för att hämta den parametriserade frågan och sedan skapa en planguide för den.

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)';  

Viktig

Värdet för de konstanta literalerna i parametern @stmt som skickas till sp_get_query_template kan påverka den datatyp som väljs för parametern som ersätter literalen. Detta påverkar matchning av planguiden. Du kan behöva skapa fler än en planguide för att hantera olika parametervärdeintervall.

Du kan också använda mallplaner i kombination med SQL-planguider. Du kan till exempel skapa en mallplansguide för att se till att en klass med frågor parametriseras. Du kan sedan skapa en SQL-planguide för den parameteriserade formen av frågan.