建议使用 sp_executesql 而不要使用 EXECUTE 语句执行字符串

原创 2007年09月18日 14:23:00

使用 sp_executesql

建议使用 sp_executesql 而不要使用 EXECUTE 语句执行字符串。支持参数替换不仅使 sp_executesql 比 EXECUTE 更通用,而且还使 sp_executesql 更有效,因为它生成的执行计划更有可能被 SQL Server 重新使用。 

自包含批处理

sp_executesql 或 EXECUTE 语句执行字符串时,字符串被作为其自包含批处理执行。SQL Server 将Transact-SQL 语句或字符串中的语句编译进一个执行计划,该执行计划独立于包含 sp_executesql 或 EXECUTE 语句的批处理的执行计划。下列规则适用于自含的批处理:

  • 直到执行 sp_executesql 或EXECUTE 语句时才将sp_executesql 或 EXECUTE 字符串中的 Transact-SQL 语句编译进执行计划。执行字符串时才开始分析或检查其错误。执行时才对字符串中引用的名称进行解析。

  • 执行的字符串中的 Transact-SQL 语句,不能访问 sp_executesql 或 EXECUTE 语句所在批处理中声明的任何变量。包含 sp_executesql 或 EXECUTE 语句的批处理不能访问执行的字符串中定义的变量或局部游标。

  • 如果执行字符串有更改数据库上下文的 USE 语句,则对数据库上下文的更改仅持续到 sp_executesql 或 EXECUTE 语句完成。
替换参数值

sp_executesql 支持对 Transact-SQL 字符串中指定的任何参数的参数值进行替换,但是 EXECUTE 语句不支持。因此,由 sp_executesql 生成的 Transact-SQL 字符串比由 EXECUTE 语句所生成的更相似。SQL Server 查询优化器可能将来自 sp_executesql 的 Transact-SQL 语句与以前所执行的语句的执行计划相匹配,以节约编译新的执行计划的开销。

使用 EXECUTE 语句时,必须将所有参数值转换为字符或 Unicode 并使其成为 Transact-SQL 字符串的一部分:

sp_executesql 示例完成的任务与前面的 EXECUTE 示例所完成的相同,但有下列额外优点:

  • 因为 Transact-SQL 语句的实际文本在两次执行之间未改变,所以查询优化器应该能将第二次执行中的 Transact-SQL 语句与第一次执行时生成的执行计划匹配。这样,SQL Server 不必编译第二条语句。

  • Transact-SQL 字符串只生成一次。

  • 整型参数按其本身格式指定。不需要转换为 Unicode。

重新使用执行计划

在 SQL Server 早期的版本中要重新使用执行计划的唯一方式是,将 Transact-SQL 语句定义为存储过程然后使应用程序执行此存储过程。这就产生了管理应用程序的额外开销。使用 sp_executesql 有助于减少此开销,并使 SQL Server 得以重新使用执行计划。当要多次执行某个 Transact-SQL 语句,且唯一的变化是提供给该 Transact-SQL 语句的参数值时,可以使用 sp_executesql 来代替存储过程。因为 Transact-SQL 语句本身保持不变仅参数值变化,所以 SQL Server 查询优化器可能重复使用首次执行时所生成的执行计划。

SQL CASE WHEN语句性能优化

背景:性能应该是功能的一个重要参考,特别是在大数据的背景之下!写SQL语句时如果仅考虑业务逻辑,而不去考虑语句效率问题,有可能导致严重的效率问题,导致功能不可用或者资源消耗过大。其中的一种情况是,处理...
  • u011442043
  • u011442043
  • 2013年07月28日 23:55
  • 7703

sp_executesql的用法

需求:表名是动态的,必须用exec来执行,然后在exec里边还得给变量动态赋值  这时候exec 就搞不定了 exec('select @count=count(empid) from '+@t...
  • jiangfei009003
  • jiangfei009003
  • 2013年04月23日 14:45
  • 1266

一次性执行多条SQL语句

本地:  windows  192.168.55.133         远程1:192.168.55.9         远程2:192.168.55.10         利用...
  • xc_gxf
  • xc_gxf
  • 2012年10月27日 09:47
  • 6965

用sp_executesql执行动态SQL语句及获得返回值

过去我执行拼凑出来的动态SQL语句,do
  • leftfist
  • leftfist
  • 2014年04月28日 22:08
  • 7712

执行动态SQL,exec和exec sp_executesql

两者都可以执行动态sql sp_executesql  可以在动态 sql 中使用变量,并且将变量输出 exec 则只能执行动态 sql 和 存储过程,也可以使用表变量,执行时需要加括号,唯一不足...
  • jc_benben
  • jc_benben
  • 2016年05月24日 17:43
  • 1923

sp_executesql介绍和使用

sp_executesql
  • feng19821209
  • feng19821209
  • 2017年03月30日 19:26
  • 1256

同时执行多条sql语句

保证sql执行的效率
  • wtt561111
  • wtt561111
  • 2014年03月24日 08:51
  • 2173

用sp_executesql 来执行拼接的sql语句,并返回值

declare @sql nvarchar(2000) declare @cou int declare @id varchar(20) set @id='1' set @sql='selec...
  • wtnu200
  • wtnu200
  • 2013年10月16日 15:58
  • 2493

sqlserver sp_executesql 动态SQL字符长度超过8000

动态SQL字符长度超过8000,我记得SQL SERVER 2005中用SP_EXECUTESQL打破了这个限制。   平常用动态SQL,可能都会用EXEC(),但是有限制,就是8000字...
  • txqd1989
  • txqd1989
  • 2017年06月23日 18:00
  • 494

建议使用 sp_executesql 而不要使用 EXECUTE 语句执行字符串

使用 sp_executesql建议使用 sp_executesql 而不要使用 EXECUTE 语句执行字符串。支持参数替换不仅使 sp_executesql 比 EXECUTE 更通用,而且还使 ...
  • mlks_2008
  • mlks_2008
  • 2007年09月18日 14:23
  • 979
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:建议使用 sp_executesql 而不要使用 EXECUTE 语句执行字符串
举报原因:
原因补充:

(最多只允许输入30个字)