SQL Server允许用字符串来动态构建T-SQL代码的一个批处理,接着再执行这个批处理。
这种功能称为动态SQL(dynamic SQL)。SQL Server提供了两种执行动态SQL的方法:
使用Exec命令和使用sp_executesql存储过程。
常在“查询条件不固定”,“改善特定任务的性能”场景下应用。
EXEC命令
Exec接受一个字符串作为输入参数,执行里面的批处理代码。Exec及支持普通字符,也支持Unicode字符。
DECLARE @Msg AS varchar(100);
SET @Msg = 'PRINT ''HELLO WORLD''';
EXEC(@Msg)
sp_executesql存储过程
Sp_executesql既接受输入参数也接受输出参数,与Exec命令不同的是,他只支持Unicode字符。
Sp_executesql存储过程有两个输入参数和一个参数赋值部分。在第一个参数@stmt中,需要指定包含想要执行的代码Unicode字符串。第二个参数@param是一个Unicode字符串,包含@stmt中所有输入,输出参数,接着为它们指定类型,用逗号分隔。
指定参数更有助于写出更安全和更有效的代码,就可以不必受SQL注入的困扰了。
DECLARE @sql AS nvarchar(100) = N'SELECT * FROM T_Order Where OrderID > @OrderID And CustID = @CustID'
-- And CustID = @CustID
exec sp_executesql
@stmt = @sql,
@params = N'@OrderID AS INT,@CustID AS INT',
@OrderID = 1,
@CustID = 1
Sp_executesql存储过程在性能上也比EXEC命令更好,因为它的参数化有助于重用缓存过的执行计划。
执行计划:执行计划是SQL Server为查询生成的物理处理计划,包含了一组指令,说明要访问哪些对象,以什么顺序,使用哪个索引,如何访问它们,使用什么链接算法等等。