sp_executesql扩展存储过程与t-sql的execute功能相似,但有一点不同,通过sp_executesql执行的执行计划会被缓存起来,可重复使用。
测试:nz.perfectaction nzperfect@gmail.com
下面测试sp_executesql和exec的性能差别
Create DATABASE T_DB
GO
USE T_DB
GO
Create TABLE TB
(ID INT IDENTITY(1,1) PRIMARY KEY,NAME VARCHAR(20))
GO
Insert INTO TB Select 'A'
Insert INTO TB Select 'B'
Insert INTO TB Select 'C'
Insert INTO TB Select 'D'
Insert INTO TB Select 'E'
Insert INTO TB Select 'F'
GO
--清除缓存中所有元素
DBCC FREEPROCCACHE
--查看T_DB数据库使用的缓存
Select SQL AS EXEC_SQL,OBJTYPE AS EXEC_TYPE,* FROM MASTER..SYSCACHEOBJECTS Where DBID=DB_ID('T_DB')
AND SQL LIKE '%Select * FROM TB Where NAME%' AND SQL NOT LIKE '%SYSCACHEOBJECTS%'
ORDER BY SQL
结果为空,
--测试使用EXEC,执行下面sql语块
DECLARE @SQL VARCHAR(2000)
DECLARE @NAME VARCHAR(20)
DECLARE @I INT
SET @I=1
WHILE @I<=6
BEGIN
IF @I=1 SET @NAME='A' IF @I=2 SET @NAME='B' IF @I=3 SET @NAME='C'
IF @I=4 SET @NAME='D' IF @I=5 SET @NAME='E' IF @I=6 SET @NAME='F'
SET @SQL = 'Select * FROM TB Where NAME = '''+@NAME+''''
EXEC(@SQL)
SET @I = @I + 1
END
--查看T_DB数据库使用的缓存
Select SQL AS EXEC_SQL,OBJTYPE AS EXEC_TYPE,* FROM MASTER..SYSCACHEOBJECTS Where DBID=DB_ID('T_DB')
AND SQL LIKE '%Select * FROM TB Where NAME%' AND SQL NOT LIKE '%SYSCACHEOBJECTS%'
ORDER BY SQL
结果有六条记录如图:
这说明sql server 对于exec执行的sql语句,即使where字段是同一个,但值不一样,每次都需要重新编译,而使用不同的缓存。
--测试使用SP_EXECUTESQL,执行下面sql语块
DECLARE @SQL NVARCHAR(2000)
DECLARE @NAME NVARCHAR(20)
DECLARE @I INT
SET @I=1
WHILE @I<=6
BEGIN
IF @I=1 SET @NAME='A' IF @I=2 SET @NAME='B' IF @I=3 SET @NAME='C'
IF @I=4 SET @NAME='D' IF @I=5 SET @NAME='E' IF @I=6 SET @NAME='F'
SET @SQL = 'Select * FROM TB Where NAME = @NAME'
EXEC SP_EXECUTESQL @SQL,N'@NAME NVARCHAR(20)',@NAME
SET @I = @I + 1
END
--查看缓存
Select SQL AS EXEC_SQL,OBJTYPE AS EXEC_TYPE,* FROM MASTER..SYSCACHEOBJECTS Where DBID=DB_ID('T_DB')
AND SQL LIKE '%Select * FROM TB Where NAME%' AND SQL NOT LIKE '%SYSCACHEOBJECTS%'
ORDER BY SQL
结果除了刚才的六条记录,又增加一条记录如图:
如上图,说明sql server 对于sp_executesql执行的sql语句,只要where字段是相同的,尽管值不同,都不再需要重新编译,而执行使用同一个缓存计划。
--测试完毕
Drop DATABASE T_DB
GO
Drop TABLE TB
GO
总结,sp_executesql执行计划会被缓存,而execute不可以,如果大量重复查询,sp_executesql比execute更能提高数据库性能。
分享到:
相关推荐
SQL Server EXEC和sp_executesql的区别
通过上面的例子已经很清晰的表明了,在执行动态SQL 语句的时候,EXEC 和 SP_EXECUTESQL 的区别了,来总结一下: 1、 性能: 官方描述:sp_executesql stmt 参数中的 Transact-SQL 语句或批处理在执行 sp_execute...
摘要1,EXEC的使用2,sp_executesql的使用MSSQL为我们提供了两种动态执行SQL语句的命令,分别是EXEC和sp_executesql;通常,sp_executesql则更具有优势,它提供了输入输出接口,而EXEC没有。还有一个最大的好处就是利用...
系统存储过程,sp_executesql 语言在这里! sp_executesql 执行可以多次重用或动态生成的 Transact-SQL 语句或批处理。Transact-SQL 语句或批处理可以包含嵌入参数。 语法 sp_executesql [@stmt =] stmt...
Exec sp_executesql N select * from tableName -- 请注意字符串前一定要加N 2:字段名,表名,数据库名之类作为变量时,必须用动态SQL eg: declare @fname varchar(20) set @fname = FiledName Select @...
declare @LikeSql nvarchar(32);–定义一个like变量,如果是存储过程,此处可以存储过程的参数 set @LikeSql = ‘someword%’;...—使用@LikePar变量进行参数化 exec sp_executesql @SelectSql ,N’@LikePa
代码如下: DECLARE @MyName NVARCHAR(100) DECLARE @FieldName SYSNAME = N’Name’ EXECUTE sp_executesql N’SELECT TOP 1 @OutputName = [‘+ @FieldName +’] FROM [dbo].[Member]’, N’@OutputName NVARCHAR...
Exec sp_executesql N'select * from tableName' -- 请注意字符串前一定要加N 2:字段名,表名,数据库名之类作为变量时,必须用动态SQL 错误: declare @fname varchar(20) set @fname = 'FiledName' Select ...
--exec sp_executesql @sql, N'@whereName nvarchar(10)' , @whereName --end CREATE PROCEDURE [dbo].[GetData2] @tbName nvarchar(10), @topnum nvarchar(10) AS BEGIN declare @sql nvarchar(50); set @...
Inline EXEC function now unwraps sp_executesql statements (UserVoice) Option to align datatypes and constraints now applies to computed columns (Forum post) Fix for CTE not formatting (Forum post) ...
) 代码如下:declare @tssj nvarchar(100) — 外部变量declare @Sql_Sql nvarchar(100) — 存sql字符串变量 set @Sql_Sql =N’select @tssj=jpk from b where bzmc=”中国”’EXEC sp_executesql @Sql_Sql,N’@...
exec sp_executesql @s与Exec(@s)的区别; SQL 2005新增的几个函数之学习; 多数据库查询; 利用NEWID函数来取随机记录; 利用ROW_NUMBER方法分页; 在数据库中处理字符串数组; ......
EXECUTE sp_executesql @SQLString, @ParmDefinition, @level = @IntVariable, @max_titleOUT=@max_title OUTPUT; SELECT @max_title; 3.1 执行简单的 SELECT 语句 以下示例将创建并执行一个简单的 SELECT 语句,...
代码如下:declare @tt varchar(20) set @tt = ‘monisubbouns’ declare @int int declare @sql nvarchar(500) set @sql = ‘select @int=count(*) from ‘ + @tt exec sp_executesql @sql,N’@int int output’,@...
exec sp_executesql @getcountsql,N'@count int output',@count=@recordcount output if @recordcount=0 begin set @pagecount = 0 return end declare @lastcount int set @lastcount = @recordcount % @PageSize...
例如:1.普通SQL语句可以用Exec执行 2、字段名,表名,数据库名之类作为变量时,必须用动态SQL 3、输出参数 (“一网打尽”通用SQL数据库...Exec sp_executesql N'select * from tableName' -- 请注意字符串前一定要加N
exec sp_executesql N'select * from tableName' -- 请注意字符串前一定要加N 2:字段名,表名,数据库名之类作为变量时,必须用动态SQL declare @fname varchar(20) set @fname = 'FiledName' --Select @fname ...
exec sp_executesql @strTmp,N'@Counts int out ',@Counts out --计算@pageCount的值 if @Counts set @pageCount = 1 else begin if @counts % @pagesize = 0 set @pageCount = (@Counts / @pageSize) else set ...
/*打开全文索引支持,启动SQL Server的全文搜索服务 */ execute sp_fulltext_database ‘enable’ /*创建全文目录*/ EXEC SP_FULLTEXT_CATALOG ‘FT_testData’,’CREATE’ /*建立全文索引数据元*/ EXEC sp_fulltext...