建立參數化查詢的計畫指南
適用於: SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體
TEMPLATE 計畫指南可搭配參數化為指定形式的獨立查詢。
下列範例會建立與參數化為特定格式的任何查詢相符的計畫指南,並引導 SQL Server 以強制執行查詢的參數化作業。 下列兩項查詢在語法上相同,不同的只是兩者的常數值。
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;
以下是參數化格式查詢的計畫指南:
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)';
在前一個範例中, @stmt
參數的值是參數化格式的查詢。 取得這個值以便於 sp_create_plan_guide 中使用的唯一可靠方法,是利用 sp_get_query_template 系統預存程序。 下列指令碼可以用來取得參數化查詢,之後再建立參數化查詢的計畫指南。
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)';
重要
傳送到 @stmt
之 sp_get_query_template
參數中的常數常值,可能會影響針對取代常值的參數所選擇的資料類型。 這會影響計畫指南的比對作業。 您可能需要建立一份以上的計畫指南,來處理不同的參數值範圍。
您也可以同時使用 TEMPLATE 計畫指南與 SQL 計畫指南。 例如,您可以建立 TEMPLATE 計畫指南以確定參數化查詢類別。 然後,您可以在該查詢的參數化形式上建立 SQL 計劃指南。