网站大量收购闲置独家精品文档,联系QQ:2885784924

自己总结MSSQL数据库技巧.doc

  1. 1、本文档共16页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
自己总结MSSQL数据库技巧

一、EXEC和sp_executesql的区别2009-09-17 16:551,EXEC的使用 2,sp_executesql的使用 MSSQL为我们提供了两种动态执行SQL语句的命令,分别是EXEC和sp_executesql;通常,sp_executesql则更具有优势,它提供了输入输出接口,而EXEC没有。还有一个最大的好处就是利用sp_executesql,能够重用执行计划,这就大大提供了执行性能,还可以编写更安全的代码。EXEC在某些情况下会更灵活。除非你有令人信服的理由使用EXEC,否则尽量使用sp_executesql。 1,EXEC的使用 EXEC命令有两种用法,一种是执行一个存储过程,另一种是执行一个动态的批处理。以下所讲的都是第二种用法。 下面先使用EXEC演示一个例子,代码1 DECLARE @TableName VARCHAR(50),@Sql NVARCHAR(MAX),@OrderID INT;SET @TableName = Orders;SET @OrderID = 10251;SET @sql = SELECT * FROM +QUOTENAME(@TableName) +WHERE OrderID = +CAST(@OrderID AS VARCHAR(10))+ ORDER BY ORDERID DESCEXEC(@sql);注:这里的EXEC括号中只允许包含一个字符串变量,但是可以串联多个变量,如果我们这样写EXEC:EXEC(SELECT TOP(+ CAST(@TopCount AS VARCHAR(10)) +)* FROM +QUOTENAME(@TableName) + ORDER BY ORDERID DESC); SQL编译器就会报错,编译不通过,而如果我们这样写:EXEC(@sql+@sql2+@sql3);编译器就会通过; 所以最佳的做法是把代码构造到一个变量中,然后再把该变量作为EXEC命令的输入参数,这样就不会受限制了; EXEC不提供接口 这里的接口是指,它不能执行一个包含一个带变量符的批处理,这里乍一听好像不明白,不要紧,下面有一个实例,你一看就知道什么意思. DECLARE @TableName VARCHAR(50),@Sql NVARCHAR(MAX),@OrderID INT;SET @TableName = Orders;SET @OrderID = 10251;SET @sql = SELECT * FROM +QUOTENAME(@TableName) +WHERE OrderID = @OrderID ORDER BY ORDERID DESCEXEC(@sql);关键就在SET @sql这一句话中,如果我们运行这个批处理,编译器就会提示以下错误 Msg 137, Level 15, State 2, Line 1 必须声明标量变量 @OrderID。 使用EXEC时,如果您想访问变量,必须把变量内容串联到动态构建的代码字符串中,如:SET @sql = SELECT * FROM +QUOTENAME(@TableName) +WHERE OrderID = +CAST(@OrderID AS VARCHAR(10))+ ORDER BY ORDERID DESC 串联变量的内容也存在性能方面的弊端。SQL Server为每一个的查询字符串创建新的执行计划,即使查询模式相同也是这样。为演示这一点,先清空缓存中的执行计划 DBCC FREEPROCCACHE (这个不是本文所涉及的内容,您可以查看MS的MSDN) /zh-cn/library/ms174283.aspx 将代码1运行3次,分别对@OrderID 赋予下面3个值,10251,10252,10253。然后使用下面的代码查询 SELECT cacheobjtype,objtype,usecounts,sql FROM sys.syscacheobjects WHERE sql NOT LIKE %cach% AND sql NOT LIKE %sys.% 点击F5运行,就会出现下面如图所示的查询结果: 我们可以看到,每执行一次都要产生一次的编译,执行计划没有得到充分重用。 EXEC除了不支持动态批处理中的输入参数外,也不支持输出参数。默认情况下,EXEC把查询的输出返回给调用者。例如下面代码返回Orders表中所有的记录数:DECLARE @sql NVARCHAR(MAX)SET @sql = SELECT COUNT(ORDERID) FROM Orders;EXEC(@sql);然而,如果你要把输出返回给调用批处理中的变量,事情就没有那么简单了。为此

文档评论(0)

xcs88858 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档