Vytvoření průvodce plánem pro parametrizované dotazy
platí pro:SQL Server
Azure SQL Database
azure 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.