sp_executesql是参数部分的长度定义发生变化能否重用执行计划

准备工作

create   table  dbo.ta(id  varchar ( 10 ) ,c  char ( 10 ))
go
insert  dbo.ta 
select  ROW_NUMBER()  over ( order   by  c1.name) id, ' x '   from  sys.columns c1  cross   join  sys.columns c2
go
create   index  index1  on  dbo.ta(id)
go
dbcc  freeproccache
go

 

接下来要用select *from ta where id='1'的方式执行两次,看看是否重用了存储过程

 

dbcc  freeproccache
go
DECLARE   @value   varchar ( 1 );
DECLARE   @SQLString   nvarchar ( 500 );
DECLARE   @ParmDefinition   nvarchar ( 500 );

/*  Build the SQL string one time. */
SET   @SQLString   =
     N
' select * from dbo.ta 
       WHERE id = @id
' ;
SET   @ParmDefinition   =  N ' @id varchar(1) ' ;
/*  Execute the string with the first parameter value.  */
SET   @value   =   ' 1 ' ;
EXECUTE  sp_executesql  @SQLString @ParmDefinition ,
                      
@id   =   @value ;
go
DECLARE   @value   varchar ( 2 );
DECLARE   @SQLString   nvarchar ( 500 );
DECLARE   @ParmDefinition   nvarchar ( 500 );

/*  Build the SQL string one time. */
SET   @SQLString   =
     N
' select * from dbo.ta 
       WHERE id = @id
' ;
SET   @ParmDefinition   =  N ' @id varchar(2) ' ;
/*  Execute the string with the first parameter value.  */
SET   @value   =   ' 10 ' ;
EXECUTE  sp_executesql  @SQLString @ParmDefinition ,
                      
@id   =   @value ;
go

 

查看执行计划

 


SELECT   execution_count,
    
SUBSTRING (st. text , (qs.statement_start_offset / 2 ) + 1
        ((
CASE  qs.statement_end_offset
          
WHEN   - 1   THEN   DATALENGTH (st. text )
         
ELSE  qs.statement_end_offset
         
END   -  qs.statement_start_offset) / 2 +   1 AS  statement_text
FROM  sys.dm_exec_query_stats  AS  qs
CROSS  APPLY sys.dm_exec_sql_text(qs.sql_handle)  AS  st
where  st. text    not   like   ' %dm_exec_sql_text% '

 

 

执行结果如下:

 

execution_count      statement_text
-------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1                    select * from dbo.ta
       WHERE id = @id
1                    select * from dbo.ta
       WHERE id = @id

(2 行受影响)

 

 

说明长度发生变化无法重用计划

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值