简单参数化

在 SQL Server 中,在 Transact-SQL 语句中使用参数或参数标记可以提高关系引擎将新的 SQL 语句与现有的、以前编译的执行计划相匹配的能力。

安全说明安全说明

使用参数或参数标记存储最终用户键入的值比将这些值串连成一个字符串,然后使用数据访问 API 方法、EXECUTE 语句或 sp_executesql 存储过程执行该字符串更安全。

如果执行不带参数的 SQL 语句,SQL Server 将在内部对该语句进行参数化以增加将其与现有执行计划相匹配的可能性。此过程称为简单参数化。在 SQL Server 2000 中,此过程称为自动参数化。

请看下面的语句:

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

可以将该语句最后的值 1 指定为一个参数。关系引擎将假定已指定参数来代替值 1,并在此基础上为此批处理生成执行计划。由于这种简单参数化,SQL Server 将认为下列两个语句实质上生成了相同的执行计划,并对第二个语句重用第一个计划:

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

SELECT * FROM AdventureWorks2008R2.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,指定对数据库中的所有查询进行参数化(但受到某些限制)。对于存在大量并发查询的数据库,这样做可以减少查询编译的频率,从而提高数据库的性能。有关详细信息,请参阅强制参数化

您也可以指定对单个查询以及其他在语法上等效,只有参数值不同的查询进行参数化。有关详细信息,请参阅使用计划指南指定查询参数化行为