动态 SQL

SQL Server 容许用字符串来动态构造 T-SQL 代码的一个批处理,接着再执行这个批处理。这种功能称为动态SQL (dynamic SQL)。SQL Server提供了两种执行动态 SQL 的方法:使用 EXEC(EXECUTE 的缩写)命令和sp_executesql 存储过程。算法

动态SQL 能够用于如下几种用途:sql

♦ 自动化管理任务。例如,对于数据库实例中的每一个数据库,查询其元数据,为其执行 BACKUP DATABASE 语句。数据库

♦ 改善特定任务的性能。例如,构造参数化的特定查询,以重用之前缓存过的执行计划。缓存

♦ 在对实际数据进行查询的基础上,构造代码元素。例如,当事先不知道在PIVOT运算符的IN子句中应该出现哪些元素时,动态构造PIVOT查询。安全

注意:当把用户的输入拼接为代码中的一部分时,要特别当心。黑客们常常会试图注入(inject )你不想运行的代码。要防止SQL注入,最好的办法就是避免将用户输入拼接为代码的一部分(例如,经过使用参数)。可是若是你确实须要将用户的输入拼接为代码的一部分,务必对用户的输入进行完全检查,看看有没有SQL注入的企图。性能

1. EXEC 命令code

EXEC 命令是T-SQL中最先提供的一种用于执行动态SQL 的方法。EXEC 接受一个字符串做为在圆括号中输入的参数,执行字符串中包含的批处理代码。EXEC 命令的输入既支持普通字符,也支持Unicode字符。对象

EXEC('SELECT * FROM dbo.Categories');索引

2. sp_executesql 存储过程接口

sp_executesql 存储过程是继EXEC命令以后引入的另外一种执行动态SQL 的方法。从sp_executesql的调用接口来讲,使用这个存储过程更安全和更灵活,由于它支持输入和输出参数。

注意:与EXEC命令不一样的是,sp_executesql 存储过程只支持使用 Unicode字符串做为其输入的批处理代码。

正由于在动态 SQL 代码中可使用输入的输出参数,这样就有助于写出更安全和更有效的代码。从安全性的角度来讲,在代码中出现的参数并非代码的一部分,而只是表达式中的运算对象。因此,经过使用参数,就能够没必要受SQL 注入的困扰了。

sp_executesql 存储过程在执行性能上要比EXEC命令更好,由于它的参数化有助于重用缓存过的执行计划。执行计划是SQL Server为查询生成的物理处理计划,包含了一组指令,说明要访问哪些对象、以什么顺序、使用哪一个索引、如何访问它们、使用什么联接算法、等等。为了简化处理,若是要重用之前缓存过的执行计划,必须知足的条件之一就是查询字符串应该和缓存中已经存在的执行计划的查询字符串相同。因此,有效重用查询执行计划最好的方法就是使用带有参数的存储过程。这样一来,即便参数值发生了变化,可查询字符串仍然保持相同。但若是你出于本身的缘由而决定使用特定的代码,而不使用存储过程,至少你仍然能够尽量地使用参数。只不过若是使用sp_executesql则会增长重用执行计划的机会。

sp_executesql 存储过程有两个输入参数和一个参数赋值部分。在第一个参数@stmt中,须要指定包含想要运行的批处理代码的Unicode字符串。第二个参数@params是一个Unicode字符串,包含@stmt中全部输入和输出参数的声明。接着为输入和输出参数指定取值,各参数之间用逗号分隔。

EXEC sp_executesql @stmt=N'SELECT orderid ,custid FROM dbo.Orders WHERE orderid=@orderid;',

          @params=N'@orderid AS INT',

          @orderid=10246;

相关文章
相关标签/搜索