EXEC与sp_executesql的区别及应用

简介: 在项目中需要将内部DECLARE的参数通过EXEC赋值后再作为下面一个EXEC参数的时候,发现都使用EXEC时,问题就不是那么简单了。趁着没有睡意研究下。EXEC的使用与缺点EXEC命令有两种用法,一种是执行一个存储过程,另一种是执行一个动态的批处理一般的使用如下,做动态SQL语句拼接,然后执行 然而上面这样的拼接语句又称为“串联变量”,而串联变量是不支持执行计划的,在我的演示代码中我已加了测试的SQL语句。
在项目中需要将内部DECLARE的参数通过EXEC赋值后再作为下面一个EXEC参数的时候,发现都使用EXEC时,问题就不是那么简单了。
趁着没有睡意研究下。
EXEC的使用与缺点
EXEC命令有两种用法,一种是执行一个存储过程,另一种是执行一个动态的批处理

一般的使用如下,做动态SQL语句拼接,然后执行

 

然而上面这样的拼接语句又称为“串联变量”,而串联变量是不支持执行计划的,在我的演示代码中我已加了测试的SQL语句。
使用DBCC FREEPROCCACHE清空缓存。(具体使用可以查看MS的MSDN: http://msdn.microsoft.com/zh-cn/library/ms174283.aspx)

在输出的数据中我们很清楚的看到系统执行了两次,没有很好地使用执行计划

 

而最重要的是当我有下面这样的需求

 

出错啦!

 

 然而我们发现这样的需求变相也是可以满足的,就是有点麻烦了,解决方案如下,使用临时表

 

 sp_executesql的使用

使用sp_executesql的话,一切将变的很简单
sp_executesql命令比EXEC命令更灵活,因为它提供一个接口,该接口及支持输入参数也支持输出参数。这功能使你可以创建带参数的查询字符串,这样就可以比EXEC更好的重用执行计划,sp_executesql的构成与存储过程非常相似,不同之处在于你是动态构建代码。它的构成包括:代码快,参数声明部分,参数赋值部分。
sp_executesql的语法
EXEC sp_executesql
@stmt = <statement>,--类似存储过程主体
@params = <params>, --类似存储过程参数部分
<params assignment> --类似存储过程调用
@stmt参数是输入的动态批处理,它可以引入输入参数或输出参数,和存储过程的主体语句一样,只不过它是动态的,而存储过程是静态的,不过你也可以在存储过程中使用sp_executesql;
@params参数与定义输入/输出参数的存储过程头类似,实际上和存储过程头的语法完全一样;
@<params assignment> 与调用存储过程的EXEC部分类似。
现在我们按照sp_executesql的语法改造下上面的查询

 

 查看执行计划的调用,很好的利用了已有的执行计划提升查询效率


 我们再去看上面那个需要使用临时表的问题

代码如下,可以将@TitleOutPut取出后再作为查询的参数给@TitleInPut赋值。

难题得解!

 


作者:Parry
出处:http://www.cnblogs.com/parry/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

相关文章
|
10月前
|
Shell C++
C++中的exec()函数
exec()函数在C++中是一个进程控制函数,用于创建新进程执行其他程序或命令行指令。exec()函数可以替换当前进程的代码和数据,创建新的进程运行其他程序。exec()函数有多个版本,例如execl、execv、execle、execve等,根据不同的参数类型和个数来使用。
137 0
|
SQL 监控 数据库
The process could not execute &#39;sp_repldone/sp_replcounters&#39; on &#39;ServerName&#39;
昨天发现发布服务器S(SQL Server 2008 R2),出现大量如下错误 错误细节如下所示: Date 10/16/2013 4:04:14 PM Log SQL Server (Current - 10/16/2013 3:44:00 PM) Source spid5...
1418 0
|
SQL Go
sql server 带有OUTPUT的INSERT,DELETE,UPDATE
原文:sql server 带有OUTPUT的INSERT,DELETE,UPDATE OUTPUT是SQL SERVER2005的新特性.
1173 0
|
存储 SQL
SQL得到任意一个存储过程的参数列表sp_procedure_params_rowset
SQL得到任意一个存储过程的参数列表sp_procedure_params_rowsetexec sp_procedure_params_rowset 'up_rpt营业收入汇总表' PROCEDURE_CATALOG PROCEDURE_SCHEMA PROCEDURE...
1048 0
|
SQL 存储 缓存
SQL Server-聚焦sp_executesql执行动态SQL查询性能真的比exec好?
原文:SQL Server-聚焦sp_executesql执行动态SQL查询性能真的比exec好? 前言 之前我们已经讨论过动态SQL查询呢?这里为何再来探讨一番呢?因为其中还是存在一定问题,如标题所言,很多面试题也好或者有些博客也好都在说在执行动态SQL查询时sp_executesql的性能比exec好,但是事实真是如此?下面我们来一探究竟。
1231 0
|
数据库 关系型数据库 MySQL