首页 > 大数据 > 正文

浅析EXEC与sp_executesql的区别及应用

2010-11-03 20:19:43  来源:博客

摘要:在项目中需要将内部DECLARE的参数通过EXEC赋值后再作为下面一个EXEC参数的时候,发现都使用EXEC时,问题就不是那么简单了。
关键词: SQL Server
 在项目中需要将内部DECLARE的参数通过EXEC赋值后再作为下面一个EXEC参数的时候,发现都使用EXEC时,问题就不是那么简单了。

  趁着没有睡意研究下。

  EXEC的使用与缺点

  EXEC命令有两种用法,一种是执行一个存储过程,另一种是执行一个动态的批处理

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

1
 

  然而上面这样的拼接语句又称为“串联变量”,而串联变量是不支持执行计划的,在我的演示代码中我已加了测试的SQL语句。

  使用DBCC FREEPROCCACHE清空缓存。(具体使用可以查看MS的MSDN:http://msdn.microsoft.com/zh-cn/library/ms174283.aspx)

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

1
 

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

1
 

  出错啦!

1
 

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

1
 

  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的语法改造下上面的查询

1
 

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

1
 

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

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

  难题得解!

1


第三十八届CIO班招生
国际CIO认证培训
首席数据官(CDO)认证培训
责编:lyre

免责声明:本网站(http://www.ciotimes.com/)内容主要来自原创、合作媒体供稿和第三方投稿,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证有关资料的准确性及可靠性,读者在使用前请进一步核实,并对任何自主决定的行为负责。本网站对有关资料所引致的错误、不确或遗漏,概不负任何法律责任。
本网站刊载的所有内容(包括但不仅限文字、图片、LOGO、音频、视频、软件、程序等)版权归原作者所有。任何单位或个人认为本网站中的内容可能涉嫌侵犯其知识产权或存在不实内容时,请及时通知本站,予以删除。