视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
mssqlserverEXEC和sp_executesql
2020-11-09 10:03:34 责编:小采
文档


mssql server EXEC和sp_executesql

,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 DESC'EXEC(@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

DESC'EXEC(@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)

http://msdn.microsoft.com/zh-cn/library/ms174283.x

将代码1运行3次,分别对@OrderID 赋予下面3个值,10251,10252,10253。然后使用

下面的代码查询

SELECT cacheobjtype,objtype,usecounts,sql FROM sys.syscacheobjects WHERE sql

下载本文
显示全文
专题