总是嫌sp_executesql麻烦,执行动态语句的时候就直接用exec @sql了,反思
1.清空过程缓存
DBCC FREEPROCCACHE
2,执行以下语句,应该只有一句sql
select sql
FROM MASTER..SYSCACHEOBJECTS
where dbid=db_id('dbname')
3.执行以下语句declare @NAME nvarchar(30),@sql nvarchar(100)
set @name ='abc'
SET @SQL = 'Select * FROM account Where playerid = '''+@NAME +''''
EXEC (@SQL)
set @name = 'def'
SET @SQL = 'Select * FROM account Where playerid = '''+@NAME +''''
EXEC (@SQL)
4 再执行2,可以看到缓存了两条@sql的语句(参数不同)
5,执行1,清空缓存,执行以下语句
declare @NAME nvarchar(30),@sql nvarchar(100)
set @name ='abc'
SET @SQL = 'Select * FROM account Where playerid = @NAME'
EXEC sp_executesql @SQL,N'@name varchar(50)',@name
set @name ='def'
SET @SQL = 'Select * FROM account Where playerid = @NAME'
EXEC sp_executesql @SQL,N'@name varchar(50)',@name
6.可以看到执行的两条@sql 缓存的是一条,也就是说数据库不用从新编译第二条执行计划
7.一定注意sp_executesql 后面的数据类型声明一定要和表里的类型一样,不一样的话可能不会引起编译错误,但是可能引起不能引用索引,比如字段类型是char(1),但是在sp_executesql中声明的是int