簡單參數化

在 SQL Server 的 Transact-SQL 陳述式中使用參數或參數標記時,可以增加關聯式引擎將新的 SQL 陳述式與先前編譯之現有執行計畫配對的能力。

安全性注意事項安全性注意事項

使用參數或參數標記來保存使用者輸入的值,會比將值串連到字串中,再使用資料存取 API 方法 (EXECUTE 陳述式) 或 sp_executesql 預存程序來執行該字串,還要來得安全。

如果在不使用參數的情況下執行 SQL 陳述式,SQL Server 會從內部參數化此陳述式,以增加它與現有執行計畫配對的可能性。此處理序即稱為簡單參數化。在 SQL Server 2000 中,此處理序就是指自動參數化。

請參考這個陳述式:

SELECT * FROM AdventureWorks.Production.Product 
WHERE ProductSubcategoryID = 1;

在陳述式尾端的數值 1,可以指定成參數。關聯式引擎會建立這個批次的執行計畫,如同已指定參數來取代值 1。由於此簡單參數化,SQL Server 認為下列兩個陳述式所產生的實際上是相同的執行計畫,因此會在第二個陳述式中重複使用第一個計畫:

SELECT * FROM AdventureWorks.Production.Product 
WHERE ProductSubcategoryID = 1;

SELECT * FROM AdventureWorks.Production.Product 
WHERE ProductSubcategoryID = 4;

在處理複雜的 SQL 陳述式時,關聯式引擎可能會無法判斷哪個運算式可以參數化。若要增加關聯式引擎將複雜的 SQL 陳述式與現有、未使用之執行計畫配對的能力,請使用 sp_executesql 或參數標記明確指定參數。如需詳細資訊,請參閱<參數和執行計畫的重複使用>。

[!附註]

當 +、-、*、/ 或 % 等算術運算子用來將 int、smallint、tinyint 或 bigint 常數值的隱含或明確轉換為 float、real、decimal 或 numeric 資料類型時,SQL Server 會套用特定的規則來計算運算式結果的類型與有效位數。不過,這些規則會隨著查詢是否參數化而有所不同。因此,在某些情況下,查詢中類似的運算式可能會產生不同的結果。如需詳細資訊,請參閱<int、bigint、smallint 和 tinyint (Transact-SQL)>。

在簡單參數化的預設行為下,SQL Server 可將較小的查詢類別參數化。不過,您可以指定資料庫中所有的查詢在特定限制下進行參數化,只要將 ALTER DATABASE 命令的 PARAMETERIZATION 選項設為 FORCED 即可。這麼做可降低查詢編譯的頻率,進而改善經歷大量並行查詢的資料庫效能。如需詳細資訊,請參閱<強制參數化>。

此外,您可以指定單一查詢,以及任何其他語法相同但唯有參數值不同的查詢,使其進行參數化。如需詳細資訊,請參閱<使用計畫指南指定查詢參數化行為>。